分别对两个人进行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;
}