分别对两个人进行bfs 计算出到达每个点的最短时间
然后枚举两个人都能达到的点,最晚到的那个人的时间就是在这个点的相遇时间。
因为要求时间最小,所以总体维护一个最小值即可
对于判断点两个人是不是能同时达到,应该判断这个点两个人是不是能在有限时间内到,而不是这个点是不是障碍
比如
1 3
C#D
答案显然是NO 不然如果判断点是不是障碍,因为一定有C和D两点,所以结果一定是YES
刚开始的做法在最后枚举的时候 判断两个人能不能达到,判断条件是该点是不是障碍,wa到自闭
#include<bits/stdc++.h> using namespace std; int to[][2]={-1,0,1,0,0,-1,0,1,-1,-1,-1,1,1,-1,1,1}; char mp[1005][1005]; bool vis[1005][1005]; int t[2][1005][1005]; int ax,ay,bx,by; int n,m; bool check(int x,int y){ return (x<1 || x>n || y<1 || y>m || mp[x][y]=='#' || vis[x][y]==1); } void bfs1(){ queue<pair<int,int>> que; t[0][ax][ay]=0; vis[ax][ay]=1; que.push({ax,ay}); while(!que.empty()){ pair<int,int> now=que.front(); int x=now.first,y=now.second; que.pop(); for(int i=0;i<8;i++){ int fx=x+to[i][0]; int fy=y+to[i][1]; if(check(fx,fy)) continue; vis[fx][fy]=1; t[0][fx][fy]=t[0][x][y]+1; que.push({fx,fy}); } } } void bfs2(){ memset(vis,0,sizeof vis); queue<pair<int,int>> que; t[1][bx][by]=0; vis[bx][by]=1; que.push({bx,by}); while(!que.empty()){ pair<int,int> now=que.front(); que.pop(); int x=now.first,y=now.second; for(int i=0;i<4;i++){ int fx=x+to[i][0]; int fy=y+to[i][1]; if(check(fx,fy)) continue; vis[fx][fy]=1; t[1][fx][fy]=t[1][x][y]+1; que.push({fx,fy}); for(int j=0;j<4;j++){ int fxx=fx+to[j][0]; int fyy=fy+to[j][1]; if(check(fxx,fyy)) continue; vis[fxx][fyy]=1; t[1][fxx][fyy]=t[1][fx][fy]; que.push({fxx,fyy}); } } } } int main(){ memset(t,-1,sizeof t); cin>>n>>m; for(int i=1;i<=n;i++){ for(int j=1;j<=m;j++) { cin>>mp[i][j]; if(mp[i][j]=='C'){ ax=i,ay=j; } if(mp[i][j]=='D'){ bx=i,by=j; } } } bfs1(); bfs2(); //cout<<endl; int ans=1e9; for(int i=1;i<=n;i++){ for(int j=1;j<=m;j++){ if(t[0][i][j]!=-1 && t[1][i][j]!=-1){ ans=min(ans,max(t[0][i][j],t[1][i][j])); } } } if(ans==1e9) cout<<"NO"; else cout<<"YES\n"<<ans; return 0; }