제출 #1125126

#제출 시각아이디문제언어결과실행 시간메모리
1125126njoopTracks in the Snow (BOI13_tracks)C++17
100 / 100
884 ms151056 KiB
#include <bits/stdc++.h>

using namespace std;

deque<tuple<int, int, int>> dq;
int h, w, dp[4010][4010], ans;
int dx[4] = {1, 0, -1, 0}, dy[4] = {0, 1, 0, -1};
char arr[4010][4010];

int main() {
    cin.tie(0)->sync_with_stdio(0);
    cin >> h >> w;
    for(int i=0; i<4001; i++) for(int j=0; j<4001; j++) dp[i][j] = 1e8;
    for(int i=0; i<h; i++) {
        for(int j=0; j<w; j++) {
            cin >> arr[i][j];
        }
    }
    dq.push_front({0, 0, 0});
    dp[0][0] = 0;
    while(dq.size()) {
        int cx = get<1>(dq.front());
        int cy = get<2>(dq.front());
        int cd = get<0>(dq.front());
        dq.pop_front();
        if(cx < 0 || cy < 0 || cx >= h || cy >= w) continue;
        if(cd > dp[cx][cy]) continue;
        for(int i=0; i<4; i++) {
            int nx = cx+dx[i], ny = cy+dy[i], nd = cd+(arr[cx][cy] == arr[nx][ny] ? 0 : 1);
            if(nx < 0 || ny < 0 || nx >= h || ny >= w || arr[nx][ny] == '.') continue;
            if(nd < dp[nx][ny]) {
                dp[nx][ny] = nd;
                if(nd == cd) dq.push_front({nd, nx, ny});
                else dq.push_back({nd, nx, ny});
            }
        }
    }
    for(int i=0; i<h; i++) {
        for(int j=0; j<w; j++) {
            if(dp[i][j] != 1e8) ans = max(ans, dp[i][j]);
        }
    }
    cout << ans+1;
    return 0; 
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...