Submission #1321085

#TimeUsernameProblemLanguageResultExecution timeMemory
1321085matzzTracks in the Snow (BOI13_tracks)C++20
100 / 100
677 ms240020 KiB
#include <bits/stdc++.h>

using namespace std;

#define FOR(i, a) for(int i = 0; i < (int) a; i++)
#define pb push_back
#define all(x) x.begin(), x.end()
#define rall(x) x.rbegin(), x.rend()
#define F first
#define S second
#define sz(x) (int)(x).size()
#define endl '\n'
#define int long long
#define mk_p make_pair
 
typedef long long ll;
typedef pair<int, int> pii;
typedef vector<int> vi;
 
//int const MAXN = 2e5 + 7;
int const MAX = 500010;
int const INF = 0x3f3f3f3f;
ll const LINF = 0x3f3f3f3f3f3f3f3f;
int const MAXN = 200010;
const int MOD = 1e9 + 7;
const int modz = 998244353;
const int MAXCOORD = 32010;
const int OFF = 1000020;

char grid[4005][4005];
int dist[4005][4005];
vector<pair<int,int>> mov = {{1,0}, {0,1}, {-1,0}, {0,-1}};
int n, m;
//check constraints

bool val(pair<int,int> u){
    return u.F >= 0 and u.S >= 0 and u.F < n and u.S < m
    and grid[u.F][u.S] != '.';
}

int bfs(pair<int,int> s){
    memset(dist, 0x3f, sizeof dist);
    dist[s.F][s.S] = 1;
    deque<pair<int,int>> dq;
    dq.pb(s);
    int ans = 0;

    while(!dq.empty()){
        pair<int,int> v = dq.front(); dq.pop_front();
        for(auto u : mov){
            u.F += v.F, u.S += v.S;
            if(val(u)){
                if(grid[v.F][v.S] == grid[u.F][u.S]){
                    if(dist[v.F][v.S] < dist[u.F][u.S]){
                        dist[u.F][u.S] = dist[v.F][v.S];
                        dq.push_front(u);
                    }
                }
                else{
                    if(dist[v.F][v.S] + 1 < dist[u.F][u.S]){
                        dist[u.F][u.S] = dist[v.F][v.S] + 1;
                        dq.push_back(u);
                    }
                }
                ans = max(ans, dist[u.F][u.S]);
            }
        }
    }
    return ans;
}

void solve(){

    cin >> n >> m;

    for(int i = 0; i < n; i++){
        for(int j = 0; j < m; j++){
            cin >> grid[i][j];
        }
    }
    pii start = {0,0};
    cout << bfs(start) << endl;
}
 
 
int32_t main() {
 
    ios::sync_with_stdio(false); cin.tie(0);

    int te = 1;// cin >> te;
    while(te--){
        solve();
    }
 
    return 0;
}  
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...