分别对两个人进行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;
}
京公网安备 11010502036488号