确定了起点和终点,明显是一个双向BFS
小A和小B的状态放在两个队列里,每次交替走,直到相遇
记得每次轮流走的时候要把这一步的状态都走完,不能只走一步

CODE

#include <algorithm>
#include <cctype>
#include <cmath>
#include <complex>
#include <cstdio>
#include <cstring>
#include <deque>
#include <functional>
#include <list>
#include <map>
#include <iomanip>
#include <iostream>
#include <queue>
#include <set>
#include <stack>
#include <string>
#include <vector>
using namespace std;
#define ll long long
#define I inline
#define ri register int
#define lowbit(x) x & -x
#define For(i , x , y) for(ri i = x ; i <= y ; ++ i)
#define Next(i , x) for(ri i = head[x] ; i ; i = e[i].nxt)
I int read() {
    int s = 0 , w = 1; char ch = getchar();
    while(ch < 48 || ch > 57) {if(ch == '-') w = -1; ch = getchar();}
    while(ch >= 48 && ch <= 57) s = (s << 1) + (s << 3) + (ch ^ 48) , ch = getchar();
    return s * w;
}

I char rd() {
    char ch = getchar();
    while(ch != '.' && ch != '#' && ch != 'C' && ch != 'D') ch = getchar();
    while(ch == '.' || ch == '#' || ch == 'C' || ch == 'D') return ch;
    return ch;
}
const int N = 1005;

struct point {
    int x , y;
};
queue <point> q[2];

int n , m ;
bool used[N][N][2];
char s[N][N];
int tx , ty , sx , sy;

int dx[8] = {1 , 0 , -1 , 0 , 1 , 1 , -1 , -1};
int dy[8] = {0 , 1 , 0 , -1 , 1 , -1 , 1 , -1};

int bfs() {
    q[0].push((point){sx , sy});
    q[1].push((point){tx , ty});
    used[sx][sy][0] = used[tx][ty][1] = 1;
    for(int tmp = 1 ; ; ++ tmp) {
        if(q[0].empty() && q[1].empty()) return -1;

         int qq = q[0].size();
         while(qq --) {
             point u = q[0].front() , v; q[0].pop();
            For(i , 0 , 7) {
                v.x = u.x + dx[i] , v.y = u.y + dy[i] ;
                if(v.x < 0 || v.x >= n || v.y < 0 || v.y >= m || s[v.x][v.y] == '#' || used[v.x][v.y][0]) continue;
                used[v.x][v.y][0] = 1;
                if(used[v.x][v.y][1] ) return tmp ;
                q[0].push(v);
            }
         }


        // printf("%d**\n" , tmp);
        // For(i , 0 , n - 1){
        //     For(j , 0 , m - 1) printf("%3d " , used[i][j][1]) ; putchar('\n');
        // }

        For(k , 1 , 2) {

            //if(q[1].empty()) return -1;
            qq = q[1].size();
            while(qq -- ) {
                point u = q[1].front() , v; q[1].pop();
                //printf("*** %d %d\n" , u.x , u.y)
                For(i , 0 , 3) {
                    v.x = u.x + dx[i] , v.y = u.y + dy[i] ;
                    if(v.x < 0 || v.x >= n || v.y < 0 || v.y >= m || s[v.x][v.y] == '#' || used[v.x][v.y][1]) continue;
                    used[v.x][v.y][1] = 1;
                    if(used[v.x][v.y][0] ) {
                           //printf("find the answer : %d %d\n" , v.x , v.y);
                        return tmp;
                    }
                    q[1].push(v);
                 }
            }


              // printf("%d**\n" , tmp);
           //  For(i , 0 , n - 1){
           //      For(j , 0 , m - 1) printf("%3d " , used[i][j][1]) ; putchar('\n');
           //  }
        }

    }
    return -1;
}
signed main() {
    freopen("in.cpp" , "r" , stdin);
    freopen("out.cpp" , "w" , stdout);
    n = read() , m = read() ;
    For(i , 0 , n - 1)
        For(j , 0 , m - 1) cin >> s[i][j];
    For(i , 0 , n - 1)
        For(j , 0 , m - 1) {
            if(s[i][j] == 'C') sx = i , sy = j;
            if(s[i][j] == 'D') tx = i , ty = j;
        }
    int ans = bfs();
    if(ans == -1) {
        puts("NO");
    } else printf("YES\n%d\n" , ans);
    return 0;
}
/*
4 5
.....
.###.
...#D
..C#.
*/