Yifenfei’s home is at the countryside, but Merceki’s home is in the center of city. So yifenfei made arrangements with Merceki to meet at a KFC. There are many KFC in Ningbo, they want to choose one that let the total time to it be most smallest.
Now give you a Ningbo map, Both yifenfei and Merceki can move up, down ,left, right to the adjacent road by cost 11 minutes.
Each test case include, first two integers n, m. (2<=n,m<=200).
Next n lines, each line included m character.
‘Y’ express yifenfei initial position.
‘M’ express Merceki initial position.
‘#’ forbid road;
‘.’ Road.
‘@’ KCF
4 4 Y.#@ .... .#.. @..M 4 4 Y.#@ .... .#.. @#.M 5 5 Y..@. .#... .#... @..M. #...#
66 8866
他不只有一个KFC!这意味着我们需要求出所有的来,找最小值。那样我们可以设立一个数组,记录人到x,y点处所用的时间,之后这要这个点是KFC,我们就更新min!!!!
除此之外就是一个很经典的BFS了
#include<cstdio> #include<iostream> #include<cstring> #include<queue> #include<algorithm> #include<stdio.h> using namespace std; struct node { int x; int y; int count; }; int n,m; char ditu[1005][1005]; bool visit[1005][1005]; int to[4][2]={{-1,0},{1,0},{0,-1},{0,1}}; int manx,many,womanx,womany; int mantime[1005][1005],womentime[1005][1005]; deque<node>Q; void BFS(node p,int mantime[][1005]) { int i; node q; memset(visit,0,sizeof(visit)); memset(mantime,0,sizeof(mantime)); Q.push_front(p); while(!Q.empty()) { p=Q.front(); Q.pop_front(); for(i=0;i<4;i++) { q.x=p.x+to[i][0]; q.y=p.y+to[i][1]; q.count=p.count+1; if (q.x>=0&&q.y>=0&&q.x<m&&q.y<n&&ditu[q.x][q.y]!='#'&&!visit[q.x][q.y]) { visit[q.x][q.y]=1; mantime[q.x][q.y]=q.count; Q.push_back(q); } } } } int main() { int i,j,min; node p; while(scanf("%d%d",&m,&n)!=EOF) { for(i=0;i<m;i++) for(j=0;j<n;j++) { cin>>ditu[i][j]; if(ditu[i][j]=='Y') { manx=i; many=j; } else if(ditu[i][j]=='M') { womanx=i; womany=j; } } } min=9999999; p.x=manx; p.y=many; p.count=0; BFS(p,mantime); p.x=womanx; p.y=womany; p.count=0; BFS(p,womentime); for (i=0;i<m;i++) for (j=0;j<n;j++) if (ditu[i][j]=='@') if (mantime[i][j]!=0&&womentime[i][j]!=0) if(mantime[i][j]+womentime[i][j]<min)/*比较求距离的最小值*/ min = mantime[i][j]+womentime[i][j]; printf("%d/n",min*11); }