HDU2612(Find a way)搜索-两次BFS
来源:互联网 发布:dx12优化补丁 编辑:程序博客网 时间:2024/04/28 06:26
/*****************************************************题目大意:Y和M要在KFC约会,地图上有多个KFC,求在哪个KFC两人所走总距离最短;算法思想:两个人到同一点的和最短,分别以两个人为起点,BFS遍历整个图;计算出到每个KFC的最短距离,然后枚举所有的KFC,求出最小的代价即可;******************************************************/#include<iostream>#include<cstdio>#include<cstring>#include<cstdlib>#include<queue>#include<algorithm>using namespace std;const int N=205;const int MAX=0xffffff;int x1,y1,x2,y2;//两个人的起点int v1[N][N];//计算路程和标记是否访问int v2[N][N];//计算路程和标记是否访问char map[N][N];//地图int dir[4][2]= {{1,0},{-1,0},{0,1},{0,-1}};//上下左右int n,m;struct node//坐标集{ int x; int y;};void BFS(int x ,int y,int v[][N]){ queue<node>Q; node p; p.x=x; p.y=y; Q.push(p); v[x][y]=0; while(!Q.empty()) { node p1=Q.front(); Q.pop(); for(int i=0; i<4; i++) { node p2; p2.x=p1.x+dir[i][0]; p2.y=p1.y+dir[i][1]; if(v[p2.x][p2.y]==MAX&&p2.x>=0&&p2.x<n&&p2.y>=0&&p2.y<m&&map[p2.x][p2.y]!='#') { v[p2.x][p2.y]=v[p1.x][p1.y]+11; Q.push(p2); } } }}void Solve(){ for(int i=0; i<n; i++) { for(int j=0; j<m; j++) { v1[i][j]=v2[i][j]=MAX; } } BFS(x1,y1,v1); BFS(x2,y2,v2); int Min=MAX; for(int i=0; i<n; i++) { for(int j=0; j<m; j++) { if(map[i][j]=='@'&&v1[i][j]!=MAX&&v2[i][j]!=MAX)//枚举所有的KFC { if(Min>v1[i][j]+v2[i][j]) Min=v1[i][j]+v2[i][j]; } } } printf("%d\n",Min);}int main(){ freopen("C:\\Users\\Administrator\\Desktop\\kd.txt","r",stdin); while(~scanf("%d%d",&n,&m)) { char ch; for(int i=0; i<n; i++) { for(int j=0; j<m; j++) { scanf(" %c",&ch); map[i][j]=ch; if(ch=='Y') { x1=i; y1=j; } if(ch=='M') { x2=i; y2=j; } } } Solve(); } return 0;}