题意:要求Y和M到一个城市中某个KFC店所花费的时间最少,求最少时间;
很简单,bfs。将Y和M能到达的各个KFC店所用的时间分别存到两个数组中,最后求出相加的最小值即可;
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<cmath>
#include<algorithm>
#define INF 1<<30
#define N 210
using namespace std;
int b[N][N],ans[N][N],ans1[N][N],n,m,ok;
char a[N][N];
struct que
{
int x,y,s;
};
que q[N*N];
void Search(int x0,int y0)
{
memset(q,0,sizeof(q));
memset(b,0,sizeof(b));
int next[4][2]= {{0,1},{1,0},{0,-1},{-1,0}};
int tx,ty,k,head,tail;
head=tail=1;
q[tail].x=x0;
q[tail].y=y0;
q[tail].s=0;
tail++;
b[x0][y0]=1;
while(head<tail)
{
for(k=0; k<=3; k++)
{
tx=q[head].x+next[k][0];
ty=q[head].y+next[k][1];
if(tx<0||ty<0||tx>n-1||ty>m-1)
continue;
if(a[tx][ty]!='#'&&b[tx][ty]==0)
{
b[tx][ty]=1;
q[tail].x=tx;
q[tail].y=ty;
q[tail].s=q[head].s+1;
tail++;
if(a[tx][ty]=='@')
{
if(ok==0)
ans[tx][ty]=q[tail-1].s;
else
ans1[tx][ty]=q[tail-1].s;
}
}
}
head++;
}
}
int main()
{
int i,j,Min,x1,x2,y1,y2;
while(~scanf("%d%d",&n,&m))
{
ok=0;
memset(ans,0,sizeof(ans));
memset(ans1,0,sizeof(ans1));
for(i=0; i<n; i++)
for(j=0; j<m; j++)
{
scanf(" %c",&a[i][j]);
if(a[i][j]=='Y')
{
x1=i;
y1=j;
}
if(a[i][j]=='M')
{
x2=i;
y2=j;
}
}
Search(x1,y1);
ok=1;
Search(x2,y2);
Min=INF;
for(i=0; i<n; i++)
for(j=0; j<m; j++)
{
if(a[i][j]=='@'&&Min>ans[i][j]+ans1[i][j]&&ans[i][j]&&ans1[i][j])//这里注意当ans和ans1数组中都有值得时候在相加。
Min=ans[i][j]+ans1[i][j];
}
printf("%d\n",Min*11);
}
return 0;
}