Submission #1276102

#TimeUsernameProblemLanguageResultExecution timeMemory
1276102nanaseyuzukiTracks in the Snow (BOI13_tracks)C++20
100 / 100
1006 ms151728 KiB
#include <bits/stdc++.h>
// Author: Kazuki_Will_Win_VOI_8703
#define fi first
#define se second
#define pii pair<int, int>
#define ll long long
#define all(a) a.begin(), a.end()
using namespace std;

const int mn = 4e3 + 5, mod = 998244353, inf = 1e9;

int h, w, d[mn][mn], vis[mn][mn];
char a[mn][mn];

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

bool Megumi(int i, int j){
    if(i <= 0 || i >= h + 1 || j <= 0 || j >= w + 1) return false;
    if(a[i][j] == '.' || vis[i][j]) return false;
    return true;
}

void solve(){
    cin >> h >> w;
    for(int i = 1; i <= h; i++){
        for(int j = 1; j <= w; j++){
            cin >> a[i][j];
        }
    }
    fill(&d[0][0], &d[0][0] + mn * mn, inf);
    queue <pii> q1, q2;
    d[1][1] = 1;
    q1.push({1, 1});

    int res = 0;
    while(q1.size() || q2.size()){
        if(!q1.size()) swap(q1, q2);
        auto [i, j] = q1.front();
        q1.pop();
        res = max(res, d[i][j]);
        for(int k = 0; k < 4; k++){
            int ni = i + dx[k], nj = j + dy[k];
            if(!Megumi(ni, nj)) continue;
            vis[ni][nj] = true;
            if(a[ni][nj] == a[i][j]){
                if(d[ni][nj] > d[i][j]){
                    d[ni][nj] = d[i][j];
                    q1.push({ni, nj});
                }
            }
            else{
                if(d[ni][nj] > d[i][j] + 1){
                    d[ni][nj] = d[i][j] + 1;
                    q2.push({ni, nj});
                }
            }
        }
    }
    cout << res << '\n';
}

signed main(){
    ios::sync_with_stdio(false);
    cin.tie(nullptr);
    cout.tie(nullptr);
    int t = 1;
    // cin >> t;
    while(t--) solve();
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...