1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44
| #include<bits/stdc++.h> #define int long long using namespace std; struct node{int x,y,dir,d;}; int dx[]={0,1,0,-1},dy[]={1,0,-1,0}; int f(int dir,char c){if(c=='A') return dir;if(c=='B') return dir^1;return dir^3;} void solve(){ int n,m,ndir,nx,ny,nd; cin>>n>>m; vector<string>v(n+3); vector<vector<vector<int>>>dis(n+3,vector<vector<int>>(m+3,vector<int>(4,1e18))); for(int i=1;i<=n;i++) cin>>v[i],v[i]=" "+v[i]; if(n==1&&m==1){ if(v[1][1]=='A') cout<<"0\n"; else cout<<"1\n"; return; } deque<node>q; q.push_front({1,2,0,(v[1][1]!='A')}); q.push_front({2,1,1,(v[1][1]!='B')}); dis[1][2][0]=(v[1][1]!='A'); dis[2][1][1]=(v[1][1]!='B'); int ans=1e18; while(!q.empty()){ auto [x,y,dir,d]=q.front();q.pop_front(); if(x>n||y>m||x<1||y<1) continue; if(ans+1<d) break; if(x==n&&y==m) ans=min(ans,d+(f(dir,v[n][m])!=0)); ndir=f(dir,v[x][y]),nx=x+dx[ndir],ny=y+dy[ndir],nd=d; if(1<=nx&&nx<=n&&1<=ny&&ny<=m&&dis[nx][ny][ndir]>nd) dis[nx][ny][ndir]=nd,q.push_front({nx,ny,ndir,nd}); for(auto C:{'A','B','C'}) if(v[x][y]!=C){ ndir=f(dir,C),nx=x+dx[ndir],ny=y+dy[ndir],nd=d+1; if(1<=nx&&nx<=n&&1<=ny&&ny<=m&&dis[nx][ny][ndir]>nd) dis[nx][ny][ndir]=nd,q.push_back({nx,ny,ndir,nd}); } } cout<<ans<<"\n"; } signed main(){ cin.tie(0)->sync_with_stdio(0); int t;cin>>t; while(t--) solve(); }
|