Submission #1268480

#TimeUsernameProblemLanguageResultExecution timeMemory
1268480lamng3Tracks in the Snow (BOI13_tracks)C++20
100 / 100
405 ms111968 KiB
// problem url: https://oj.uz/problem/view/BOI13_tracks
#include <bits/stdc++.h>
using namespace std;

#define fi first
#define se second

typedef vector<int> vi;
typedef vector< vector<int> > vii;
typedef pair<int,int> pii;

const int INF = 1e9+7;

int dx[4] = {1,-1,0,0};
int dy[4] = {0,0,1,-1};

int h, w;
vector<string> snow;

bool inside(int x, int y) {
    return 0 <= x && x < h && 0 <= y && y < w && snow[x][y] != '.';
}

void solve() {
    cin >> h >> w; snow.resize(h);
    for (int i = 0; i < h; i++) cin >> snow[i];

    if (snow[0][0] == '.') {
        cout << 0 << '\n';
        return;
    }

    int ans = 1;
    vii d(h, vi(w, INF));
    d[0][0] = 1;
    
    deque<pii> dq;
    dq.push_back(pii(0,0));
    while (!dq.empty()) {
        pii u = dq.front(); dq.pop_front();
        int ux = u.fi, uy = u.se;
        ans = max(ans, d[ux][uy]);
        for (int i = 0; i < 4; i++) {
            int vx = ux + dx[i], vy = uy + dy[i];
            if (!inside(vx, vy)) continue;
            int w = (snow[ux][uy] != snow[vx][vy]);
            if (d[vx][vy] == INF) {
                d[vx][vy] = d[ux][uy] + w;
                if (w) dq.push_back(pii(vx,vy));
                else dq.push_front(pii(vx,vy));
            }
        }
    }

    cout << ans << '\n';
}

int main() {
    ios::sync_with_stdio(0); cin.tie(0);
    int tt = 1;
    // cin >> tt;
    while (tt--) solve();
    return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...