Submission #1249364

#TimeUsernameProblemLanguageResultExecution timeMemory
1249364starbinhasTracks in the Snow (BOI13_tracks)C++20
100 / 100
907 ms122564 KiB
#include <bits/stdc++.h>
using namespace std;

#define INF 16000001

typedef pair<int, int> pii;

int main() {
    int h, w;
    cin >> h >> w;
    
    char grid[h + 2][w + 2];
    for (int i = 0; i <= h + 1; i++) {
        for (int j = 0; j <= w + 1; j++) {
            if (i < 1 || i > h || j < 1 || j > w) grid[i][j] = '.';
            else cin >> grid[i][j];
        }
    }

    int d[h + 1][w + 1];
    for (int i = 1; i <= h; i++) {
        for (int j = 1; j <= w; j++) {
            d[i][j] = INF;
        }
    }
    d[h][w] = 0;
    deque<pii> q;
    q.push_front({h, w});
    bool processed[h + 1][w + 1] = {};
    while (!q.empty()) {
        int a, b;
        tie(a, b) = q.front();
        q.pop_front();
        if (processed[a][b]) continue;
        processed[a][b] = true;
        if (grid[a + 1][b] != '.' && d[a + 1][b] > d[a][b] + (grid[a + 1][b] != grid[a][b])) {
            d[a + 1][b] = d[a][b] + (grid[a + 1][b] != grid[a][b]);
            if (grid[a + 1][b] != grid[a][b]) q.push_back({a + 1, b});
            else q.push_front({a + 1, b});
        }
        if (grid[a - 1][b] != '.' && d[a - 1][b] > d[a][b] + (grid[a - 1][b] != grid[a][b])) {
            d[a - 1][b] = d[a][b] + (grid[a - 1][b] != grid[a][b]);
            if (grid[a - 1][b] != grid[a][b]) q.push_back({a - 1, b});
            else q.push_front({a - 1, b});
        }
        if (grid[a][b + 1] != '.' && d[a][b + 1] > d[a][b] + (grid[a][b + 1] != grid[a][b])) {
            d[a][b + 1] = d[a][b] + (grid[a][b + 1] != grid[a][b]);
            if (grid[a][b + 1] != grid[a][b]) q.push_back({a, b + 1});
            else q.push_front({a, b + 1});
        }
        if (grid[a][b - 1] != '.' && d[a][b - 1] > d[a][b] + (grid[a][b - 1] != grid[a][b])) {
            d[a][b - 1] = d[a][b] + (grid[a][b - 1] != grid[a][b]);
            if (grid[a][b - 1] != grid[a][b]) q.push_back({a, b - 1});
            else q.push_front({a, b - 1});
        }
    }

    int ans = 0;
    for (int i = 1; i <= h; i++) {
        for (int j = 1; j <= w; j++) {
            if (grid[i][j] != '.') ans = max(ans, d[i][j]);
        }
    }
    cout << ans + 1 << endl;

    return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...