题意:略。
题记:将小A和小B做为起点BFS两次,分别记录下小A和小B到每个位置的时间,最后枚举小A和小B相遇的位置,取小A和小B到当前位置的时间的最大值(相当于小A和小B在这个位置相遇)。
#include<bits/stdc++.h>
using namespace std;
const int N=1010,INF=0x3f3f3f3f;
int n,m,dx1,dx2,dy1,dy2;
int dis[][2]={1,0,0,1,-1,0,0,-1,1,1,1,-1,-1,-1,-1,1};
//八个方向
char s[N][N];
bool vis[N][N];
int t1[N][N];
int t2[N][N];
struct Node{
int x,y,step;
};
bool check(int x,int y){
if(x<1||x>n||y<1||y>m||vis[x][y]||s[x][y]=='#')
return false;
return true;
}
void bfs1(){
memset(vis,0,sizeof(vis));
queue<Node>q;
Node st,ne;
st.x=dx1;st.y=dy1;st.step=0;
vis[dx1][dy1]=1;
t1[dx1][dy1]=0;
q.push(st);
while(!q.empty()){
st=q.front();
q.pop();
for(int i=0;i<8;i++){
ne.x=st.x+dis[i][0];
ne.y=st.y+dis[i][1];
ne.step=st.step+1;
if(check(ne.x,ne.y)){
vis[ne.x][ne.y]=1;
t1[ne.x][ne.y]=ne.step;
q.push(ne);
}
}
}
}
void bfs2(){
memset(vis,0,sizeof(vis));
queue<Node>q;
Node st,ne,ed;
st.x=dx2;st.y=dy2;st.step=0;
vis[dx2][dy2]=1;
t2[dx2][dy2]=0;
q.push(st);
while(!q.empty()){
st=q.front();
q.pop();
for(int i=0;i<4;i++){
ne.x=st.x+dis[i][0];
ne.y=st.y+dis[i][1];
ne.step=st.step+1;
if(check(ne.x,ne.y)){
vis[ne.x][ne.y]=1;
t2[ne.x][ne.y]=ne.step;
q.push(ne);
for(int j=0;j<4;j++){
ed.x=ne.x+dis[j][0];
ed.y=ne.y+dis[j][1];
ed.step=st.step+1;
if(check(ed.x,ed.y)){
vis[ed.x][ed.y]=1;
t2[ed.x][ed.y]=ed.step;
q.push(ed);
}
}
}
}
}
}
int main(){
cin>>n>>m;
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++){
cin>>s[i][j];
if(s[i][j]=='C'){
dx1=i;
dy1=j;
}
if(s[i][j]=='D'){
dx2=i;
dy2=j;
}
}
memset(t1,-1,sizeof(t1));
memset(t2,-1,sizeof(t2));
bfs1();
bfs2();
/*
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++)
cout<<t1[i][j]<<' ';
cout<<endl;
}
cout<<endl;
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++)
cout<<t2[i][j]<<' ';
cout<<endl;
}
*/
int ans=INF;
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
if(t1[i][j]!=-1&&t2[i][j]!=-1)
ans=min(ans,max(t1[i][j],t2[i][j]));
if(ans==INF)cout<<"NO"<<endl;
else cout<<"YES"<<endl<<ans<<endl;
return 0;
}

京公网安备 11010502036488号