双向bfs
小A与小B
https://ac.nowcoder.com/acm/contest/549/G
#include<bits/stdc++.h> using namespace std; #define ll long long int const N=1e3+7; int n,m,sx1,sy1,sx2,sy2,f; char ch[N][N]; struct L{ int x,y,t; }; queue<L>q[2]; int vis[N][N][3]; int xx[]={1,-1,0,0,1,-1,1,-1}; int yy[]={0,0,1,-1,1,-1,-1,1}; int bfs(int x){ int zt=q[x].size(); while(zt--){ for(int i=0;i<8-x*4;++i){ int dx=q[x].front().x+xx[i]; int dy=q[x].front().y+yy[i]; int dt=q[x].front().t+f; if(dx>=1&&dx<=n&&dy>=1&&dy<=m&&!vis[dx][dy][x]&&ch[dx][dy]=='.'){ if(vis[dx][dy][1-x]) retur***is[dx][dy][x]=1; q[x].push((L){dx,dy,dt}); } } q[x].pop(); } return 0; } int solve(){ int z=0; while(!q[0].empty()||!q[1].empty()){ f=1; if(z=bfs(0)) return z; if(z=bfs(1)) return z; f=0; if(z=bfs(1)) return z; } return 0; } int main(){ cin >> n >> m; for(int i=1;i<=n;++i){ for(int j=1;j<=m;++j){ cin >> ch[i][j]; if(ch[i][j]=='C') sx1=i,sy1=j; if(ch[i][j]=='D') sx2=i,sy2=j; } } vis[sx1][sy1][0]=1;vis[sx2][sy2][1]=1; q[0].push( (L){sx1,sy1,0} ); q[1].push( (L){sx2,sy2,0} ); int ans=solve(); if(ans){ cout << "YES\n"; cout << ans; } else cout << "NO"; return 0; }