题意:略。

题记:将小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;
}