题目大概的意思就是两个人Y和M约在KFC见面,找到一家KFC使得两个人到达时的距离之和最短,并且Y不能经过M的出发地,M不能经过Y的出发地。
思路也很清晰,用两次BFS,找出Y和M分别到每个KFC所需要的时间,然后把两个人到达每个KFC需要的时间加起来,找出最小值,这个最小值就是题目要求的值,附代码如下:
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
char mp[1010][1010];
int vis[1010][1010],step1[1010][1010],step2[1010][1010],n,m;
int mv[4][2] = {0,1,0,-1,1,0,-1,0};
typedef pair <int,int> P;
void bfs(int a,int b,int c,int d,int step[1010][1010])
{
P que[220*220];
int frt = 0,til = 0;
que[til].first = a;
que[til++].second = b;
vis[a][b] = 1;
step[a][b] = 0;
while(frt < til)
{
P p = que[frt];
int next_x,next_y;
for(int i = 0;i < 4; i++)
{
next_x = p.first + mv[i][0];
next_y = p.second + mv[i][1];
if(next_x == c && next_y == d)
continue;
if(next_x >= 0 && next_x < n && next_y >= 0 && next_y < m && mp[next_x][next_y] != '#' && !vis[next_x][next_y])
{
que[til].first = next_x;
que[til].second = next_y;
vis[next_x][next_y] = 1;
til++;
step[next_x][next_y] = step[p.first][p.second] + 1;
}
}
frt++;
}
}
int main()
{
int yx,yy,mx,my;
while(scanf("%d %d",&n,&m) != EOF)
{
memset(vis,0,sizeof(vis));
getchar();
for(int i = 0;i < n; i++)
{
scanf("%s",mp[i]);
getchar();
for(int j = 0;j < m; j++)
{
if(mp[i][j] == 'Y')
yx = i,yy = j;
if(mp[i][j] == 'M')
mx = i,my = j;
}
}
bfs(mx,my,yx,yy,step1);
memset(vis,0,sizeof(vis));
bfs(yx,yy,mx,my,step2);
int ans = 0x3f3f3f3f;
for(int i = 0;i < n; i++)
{
for(int j = 0;j < m; j++)
{
if(mp[i][j] == '@')
{
// printf("%d %d %d %d\n",i,j,step1[i][j],step2[i][j]);
int he = step1[i][j] + step2[i][j];
if(he < ans)
ans = he;
}
}
}
printf("%d\n",ans * 11);
}
return 0;
}