Submission #1353550

#TimeUsernameProblemLanguageResultExecution timeMemory
1353550coderg300711Tracks in the Snow (BOI13_tracks)C++20
In queue
0 ms0 KiB
#include "bits/stdc++.h"
using namespace std;
#define fi first
#define se second
#define mp make_pair
#define pii pair<int,int>
#define pll pair<long long,long long>
#define yes cout<<"Yes\n"
#define no cout<<"No\n"
#define pb push_back
#define sz(x) (int)(x).size()
#define rsz resize
#define ass assign
#define F(i,l,r) for(int i=(l);i<(r);++i)
typedef long long ll;
typedef unsigned long long ull;
typedef long double lld;
template<typename T> using pqg = priority_queue<T, vector<T>, greater<T>>;
#define each(a,x) for(auto a:x)
#define FOR(i,a) for(int i=0;i<(a);i++)
#define ROF(i,a,b) for(int i=(b)-1;i>=(a);i--)
#define eb emplace_back
#define ft front()
#define V vector

#ifndef ONLINE_JUDGE
#define debug(x) cerr << #x <<" "; _print(x); cerr << endl;
#else
#define debug(x)
#endif

void _print(ll t) {cerr << t;}
void _print(int t) {cerr << t;}
void _print(string t) {cerr << t;}
void _print(char t) {cerr << t;}
void _print(lld t) {cerr << t;}
void _print(double t) {cerr << t;}
void _print(ull t) {cerr << t;}

template <class T, class V> void _print(pair <T, V> p);
template <class T> void _print(vector <T> v);
template <class T> void _print(set <T> v);
template <class T, class V> void _print(map <T, V> v);
template <class T> void _print(multiset <T> v);
template <class T, class V> void _print(pair <T, V> p) {cerr << "{"; _print(p.ff); cerr << ","; _print(p.ss); cerr << "}";}
template <class T> void _print(vector <T> v) {cerr << "[ "; for (T i : v) {_print(i); cerr << " ";} cerr << "]";}
template <class T> void _print(set <T> v) {cerr << "[ "; for (T i : v) {_print(i); cerr << " ";} cerr << "]";}
template <class T> void _print(multiset <T> v) {cerr << "[ "; for (T i : v) {_print(i); cerr << " ";} cerr << "]";}
template <class T, class V> void _print(map <T, V> v) {cerr << "[ "; for (auto i : v) {_print(i); cerr << " ";} cerr << "]";}

char a[4005][4005];
int dist[4005][4005],dx[]={0,0,1,-1},dy[]={1,-1,0,0};

void solve(){
int h,w;
cin>>h>>w;
FOR(i,h){
  FOR(j,w){
    cin>>a[i][j];
    dist[i][j]=1e9;
  }
}
//bfs 0-1
deque<pii> dq;
dq.pb({0,0});
dist[0][0]=1;
int res=1;
while(!dq.empty()){
  pii cur=dq.ft;
  dq.pop_front();
  int r=cur.fi,c=cur.se;
  //we track the deepest level we've reach
  res=max(res,dist[r][c]);
  FOR(i,4){
    int nr=r+dx[i],nc=c+dy[i];
    if(nr>=0 && nr<h && nc>=0 && nc<w && a[nr][nc]!='.'){
      //if it's the same trail,cost 0,otherwise,cost 1
      int wei=!(a[r][c]==a[nr][nc]);
      if(dist[r][c]+wei<dist[nr][nc]){
        dist[nr][nc]=dist[r][c]+wei;
        if(!wei)dq.push_front({nr,nc});//high priority
        else dq.pb({nr,nc});
      }
    }
  }
}
cout<<res<<'\n';
}

signed main(){
    ios_base::sync_with_stdio(0);cin.tie(nullptr);
    #ifndef ONLINE_JUDGE
      freopen("output.txt", "w", stdout);
      freopen("input.txt", "r", stdin);
      freopen("Error.txt", "w", stderr);
    #endif 
  
    int tt=1;
//    cin>>tt;
    while(tt--)solve();

    return 0;
}