제출 #1310962

#제출 시각아이디문제언어결과실행 시간메모리
1310962michud07Tracks in the Snow (BOI13_tracks)C++20
100 / 100
1627 ms160408 KiB
#include <bits/stdc++.h>
using namespace std;
typedef pair<int, int> pii;

struct trio{
    int val, x, y;
    bool operator < (const trio& other)const{
        return val < other.val;
    }
};


const int N = 4003;
const vector<pii> DIR = {{1, 0}, {-1, 0}, {0, 1}, {0, -1}};
char tab[N][N];
int dist[N][N];
bool vis[N][N];
priority_queue<trio> pq;

void solve(){
    vis[1][1] = 1;
    pq.push({0, 1, 1});
    int x, y, xp, yp;
    while(!pq.empty()){
        x = pq.top().x;
        y = pq.top().y;
        pq.pop();
        for(auto p : DIR){
            xp = x + p.first;
            yp = y + p.second;
            if(vis[xp][yp]) continue;
            if(tab[x][y] == tab[xp][yp]){
                pq.push({-dist[x][y], xp, yp});
                dist[xp][yp] = dist[x][y];
                vis[xp][yp] = 1;
            }else if(tab[xp][yp] == 'F' || tab[xp][yp] == 'R'){
                dist[xp][yp] = dist[x][y] + 1;
                vis[xp][yp] = 1;
                pq.push({-dist[xp][yp], xp, yp});
            }
        }
    }
}

int main(){
    ios_base::sync_with_stdio(0);
    cin.tie(0);
    int h, w;
    cin >> h >> w;
    for(int i = 1 ; i <= h ; i++){
        for(int j = 1 ; j <= w ; j++){
            cin >> tab[i][j];
        }
    }
    solve();
    int ans = 0;
    for(int i = 1 ; i <= h ; i++){
        for(int j = 1 ; j <= w ; j++){
            ans = max(ans, dist[i][j]);
        }
    }
    cout << ans + 1 << '\n';
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...