HDU 2612 find a way 【双BFS】
<题目链接>
题目大意:
两个人分别从地图中的Y 和 M出发,要共同在 @ 处会面(@不止有一处),问这两个人所走距离和的最小值是多少。
解题分析:
就是对这两个点分别进行一次BFS,求出它们到每一个 @ 点的最短距离,然后距离和最小的即为所求(图上一步相当于 11)。注意判断两个人是否都能够走到那个@点,如果不能走到,那么那个距离和应该作废。
#include<iostream> #include<queue> #include<algorithm> #include<memory.h> #include<utility> using namespace std; typedef pair<int,int> P; const int MAX=201; int dir[4][2]={1,0,0,1,-1,0,0,-1}; char maze[MAX][MAX]; int visa[MAX][MAX],visb[MAX][MAX]; int n,m; void bfs(int x,int y,int vis[][MAX]) { queue<P>q; q.push(P(x,y)); while(!q.empty()) { P p=q.front(); q.pop(); for(int i=0;i<4;i++) { int nx=p.first+dir[i][0],ny=p.second+dir[i][1]; if(nx>=0&&ny>=0&&nx<n&&ny<m&&maze[nx][ny]!='#'&&vis[nx][ny]==0) { vis[nx][ny]=vis[p.first][p.second]+11; q.push(P(nx,ny)); } } } } int main() { while(~scanf("%d%d",&n,&m)) { int a,b,c,d; memset(visa,0,sizeof(visa)); memset(visb,0,sizeof(visb)); for(int i=0;i<n;i++){ scanf("%s",&maze[i]); for(int j=0;j<m;j++) { if(maze[i][j]=='Y') { a=i,b=j; } if(maze[i][j]=='M') { c=i,d=j; } } } bfs(a,b,visa); bfs(c,d,visb); int mini=0x3f3f3f3f; for(int i=0;i<n;i++) for(int j=0;j<m;j++) if(maze[i][j]=='@'&&visa[i][j]+visb[i][j]!=0) //未到达的KFC mini=min(mini,visa[i][j]+visb[i][j]); cout<<mini<<endl; } return 0; }
2018-08-29
作者:is_ok
出处:http://www.cnblogs.com/00isok/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。