Submission #953734

#TimeUsernameProblemLanguageResultExecution timeMemory
953734KakarotTracks in the Snow (BOI13_tracks)C++98
0 / 100
80 ms159268 KiB
#include <bits/stdc++.h>
#define int int64_t
using namespace std;

void setIO() {
    cin.tie(0)->sync_with_stdio(0);
}

bool inside(int x, int y, int n, int m, vector<string> &grid) {
    return (x > -1 && x < n && y > -1 && y < m && grid[x][y] != '.');
}

void solve() {
    //cout << "zco";
    int n, m;
    cin >> n >> m;
    vector<string> grid(n);
    for(auto &x : grid) cin >> x;
    deque<pair<int, int>> dq;
    dq.push_back({0, 0});
    vector<vector<int>> depth(n, vector<int>(n, 1e18));
    depth[0][0] = 0;
    vector<int> di { -1, 0, 1, 0} , dj { 0, 1, 0, -1};
    //auto inside = [](int x, int y, int &n, int &m) { return (x > -1 && x < n && y > -1 && y < m); };
    int ans = 1;
    while(!dq.empty()) {
        auto u = dq.front();
        dq.pop_front();
        ans = max(ans, depth[u.first][u.second]);
        for(int i = 0; i < 4; i++) {
            int x = u.first+di[i], y = u.second+dj[i];
            if(inside(x, y, n, m, grid) && (depth[x][y] + (grid[x][y] != grid[u.first][u.second])) < depth[x][y]) {
                depth[x][y] = depth[u.first][u.second] + (grid[u.first][u.second] != grid[x][y]);
                if(grid[u.first][u.second] != grid[x][y]) dq.push_back({x, y});
                else dq.push_front({x, y});
            }
        }
    }
    cout << ans+1;
}

int32_t main() {
    setIO();
    solve();
    return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...