题意

一个的迷宫,小A每次可以移动一个位置,而小B每次可以移动两次位置,小A移动的方向是上下左右左上左下右上右下8个方向,小B移动的方向是上下左右4个方向,请问他们最早什么时候能够找到对方?

分析

先对小A进行bfs,求出每个格子的访问时间,再对小B进行bfs,求出每格相遇的时间,统计结果。

#include <bits/stdc++.h>
using namespace std;
#define mem(a,b) memset(a,b,sizeof(a))
#define pii pair<int,int>
const int inf = 0x3f3f3f3f;
const int maxn = 1110;
const int M = 1e9+7;
int n,m,ans = 1e6;

char s[maxn][maxn];

int tim[2][maxn][maxn];        //0表示小A,1表示小B

int to[8][2] = {0,1,1,0,0,-1,-1,0,1,1,-1,1,-1,-1,1,-1};

void bfs(int k,int x,int y)
{
    tim[k][x][y] = 0;
    queue<pii> q;
    q.push({x,y});
    while(!q.empty())
    {
        x = q.front().first;y = q.front().second;q.pop();
        for(int i = 0; i < 8; i++)
        {
            int xx = x + to[i][0];
            int yy = y + to[i][1];
            if(xx > n || yy > m || x <= 0 || y <= 0 || tim[k][xx][yy] < inf) continue;
            if(s[xx][yy] == '#') continue;
            tim[k][xx][yy] = tim[k][x][y]+1;
            q.push({xx,yy});
        }
    }
}

void bfs2(int x,int y)
{
    tim[0][x][y] = 0;
    queue<pii> q;
    q.push({x,y});
    while(!q.empty())
    {
        x = q.front().first;y = q.front().second;q.pop();
        ans = min(ans,max(tim[1][x][y],(tim[0][x][y]+1)/2));
        for(int i = 0; i < 4; i++)
        {
            int xx = x + to[i][0];
            int yy = y + to[i][1];
            if(xx > n || yy > m || x <= 0 || y <= 0 || tim[0][xx][yy] < inf) continue;
            if(s[xx][yy] == '#') continue;
            tim[0][xx][yy] = tim[0][x][y]+1;
            q.push({xx,yy});
        }
    }
}

signed main()
{
    cin>>n>>m;
    for(int i = 1; i <= n; i++)
    {
        for(int j = 1; j <= m; j++)
        {
            tim[0][i][j] = tim[1][i][j] = inf;
        }
    }
    for(int i = 1; i <= n; i++)
    {
        for(int j = 1; j <= m; j++)
        {
            cin>>s[i][j];
        }
    }
    for(int i = 1; i <= n; i++)
    {
        for(int j = 1; j <= m; j++)
        {
            if(s[i][j] == 'C')
            {  
                bfs(1,i,j);
            }
        }
    }
    for(int i = 1; i <= n; i++)
    {
        for(int j = 1; j <= m; j++)
        {
            if(s[i][j] == 'D')
            {  
                bfs2(i,j);
            }
        }
    }
    if(ans == 1e6)
    {
        puts("NO");
    }
    else
    {  
        puts("YES");
        cout<<ans<<endl;
    }
    return 0;
}