题目链接:http://www.pipioj.online/problem.php?id=1357

题目描述:

PIPI和他的朋友POPO在中南大学迷路了,他们都希望尽快找到彼此。
PIPI每秒可以移动两次,每次可以在四个方向上移动到另一个空间:上/下/左/右。POPO每秒可以移动一次,并且每次可以在八个方向上移动到另一个空间:上/下/左/右/右上/右下/左上/左下。
PIPI和POPO相遇需要几秒钟?给最少的时间。

#include<bits/stdc++.h> 
using namespace std;
const int N=1005;
const int INF=1e7+5;
int n,m,dir2[4][2]={{0,1},{1,0},{0,-1},{-1,0}};
int dir1[8][2]={{0,1},{0,-1},{1,0},{-1,0},{1,-1},{-1,-1},{-1,1},{1,1}};
char maze[N][N];
bool judeg(int x,int y){
    if(x<0||x>=n||y<0||y>=m||maze[x][y]=='#') return false;
    return true;
}
int vis1[N][N],vis2[N][N];
struct node{
    int x,y,t;
};
void bfs1(int i,int j,int t){
    queue<node>q;
    for(int i=0;i<N;i++) for(int j=0;j<N;j++) vis1[i][j]=INF;
    q.push({i,j,0});
    vis1[i][j]=0;
    while(q.size()){
        node now=q.front();q.pop();
        for(int i=0;i<8;i++){
            int xx=now.x+dir1[i][0],yy=now.y+dir1[i][1];
            if(vis1[xx][yy]!=INF||!judeg(xx,yy)) continue;
            vis1[xx][yy]=now.t+1;
            q.push({xx,yy,now.t+1});
        }
    }
    
}
void bfs2(int i,int j,int t){
    queue<node>q;
    while(!q.empty()) q.pop();
    for(int i=0;i<N;i++) for(int j=0;j<N;j++) vis2[i][j]=INF;
    q.push({i,j,0});
    vis2[i][j]=0;
    while(q.size()){
        node now=q.front();q.pop();
        for(int i=0;i<4;i++){
            int xx=now.x+dir2[i][0],yy=now.y+dir2[i][1];
            if(vis2[xx][yy]!=INF||!judeg(xx,yy)) continue;
            vis2[xx][yy]=now.t+1;
            q.push({xx,yy,now.t+1});
            for(int i=0;i<4;i++){
                int xx1=xx+dir2[i][0],yy1=yy+dir2[i][1];
                if(vis2[xx1][yy1]!=INF||!judeg(xx1,yy1)) continue;
                vis2[xx1][yy1]=now.t+1;
                q.push({xx1,yy1,now.t+1});
            }    
        }    
    }
         
}
int main(){
    scanf("%d%d",&n,&m);
    for(int i=0;i<n;i++) scanf("%s",maze[i]);
    for(int i=0;i<n;i++){
        for(int j=0;j<m;j++){
            if(maze[i][j]=='C') bfs1(i,j,0);
            else if(maze[i][j]=='D') bfs2(i,j,0);
        }
    }
    int min1=INF;
    for(int i=0;i<n;i++){
        for(int j=0;j<m;j++){
              min1=min(min1,max(vis1[i][j],vis2[i][j]));//两者相遇的时间取决于晚到的那个, 
          }
        }
    if(min1!=INF) printf("YES\n%d\n",min1);
    else printf("NO\n");
    
}