题目链接: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"); }