题意:走迷宫,问能不能碰头,能的话,什么时候碰头
题解:广搜,定义一个时间戳,分别把两个开始点能走到的点的时间戳+1,然后把这些能走到的点,的能走到的点的时间戳+2......(已经走过的点不能再往回走)
如果最后队列为空,仍没有可以重合的点,输出NO
否则输出YES,合最开始重合的时间戳
#include<bits/stdc++.h> using namespace std; struct qw { int x,y; }t; int n,m,vis[2][1005][1005],step=0; char a[1005][1005]; queue<qw> q[2]; int dx[]={0,0,1,-1,1,1,-1,-1},dy[]={1,-1,0,0,1,-1,1,-1}; void bfs(int w) { int len=q[w].size(); while(len--) { t=q[w].front();q[w].pop(); for(int i=0;i<4+(w==0?4:0);i++) { int bx=t.x+dx[i],by=t.y+dy[i]; if(bx>n||bx<1||by>m||by<1||vis[w][bx][by]||a[bx][by]=='#') continue; vis[w][bx][by]=1;q[w].push((qw){bx,by}); if(vis[w^1][bx][by]) {cout<<"YES"<<endl<<step<<endl;exit(0);} } } } void solve() { while(step<=n*m) { step++;//时间戳 bfs(0);//小A走8个方向 bfs(1);//小B连续走两次 bfs(1); } cout<<"NO"<<endl; } int main() { ios::sync_with_stdio(false); int i,j; cin>>n>>m; for(i=1;i<=n;i++) for(j=1;j<=m;j++) { cin>>a[i][j]; if(a[i][j]=='C') q[0].push((qw){i,j}),vis[0][i][j]=1; if(a[i][j]=='D') q[1].push((qw){i,j}),vis[1][i][j]=1; } solve(); }