4 4 Y.#@ .... .#.. @..M 4 4 Y.#@ .... .#.. @#.M 5 5 Y..@. .#... .#... @..M. #...#
66 88 66
题意,Y和M两个人分别同乡村和城市出发,想去吃KFC,问最短时间能到达哪家KFC。
注意:Y走的话,可以走M。M走的话,可以走Y。‘@’代表KFC。‘#’是不能走的。
思路:跑两遍BFS,将每个人到达每一个KFC的步数用数组记录下来,然后遍历整个地图,找到两个人同时到达某一个KFC的最小值。
#include <stdio.h>
#include <string.h>
#include <queue>
#include <algorithm>
#define inf 0x6ffffff
using namespace std;
char map[202][202];// 地图
int vis[202][202];// 标记数组
int flag1[202][202];//记录M到达任意KFC的时间
int flag[202][202];//记录Y到达任意KFC的时间
int n,m;
int x1,y1,x2,y2;
int dir[4][2]={{1,0},{-1,0},{0,1},{0,-1}};
struct node
{
int x,y,step;
}
;
bool check(int x,int y)
{
if(x<0 ||y<0 ||x>=n ||y>=m ||map[x][y]=='#' ||vis[x][y]) //检查是否越界,是否已经搜过
return 0;
return 1;
}
void bfs(int x,int y,int a[][202]) //进入坐标和记录数组
{
int i;
node st,ed;
queue<node>q;
st.x=x;
st.y=y;
st.step=0;
q.push(st);
while(!q.empty())
{
st=q.front();
q.pop();
for(i=0;i<4;i++)
{
ed.x=st.x+dir[i][0];
ed.y=st.y+dir[i][1];
if(!check(ed.x,ed.y))
continue;
ed.step=st.step+1;
vis[ed.x][ed.y]=1;
if(map[ed.x][ed.y]=='@')
{
a[ed.x][ed.y]=ed.step;
}
q.push(ed);
}
}
}
int main()
{
int i,j;
while(~scanf("%d%d",&n,&m))
{
memset(flag,0,sizeof(flag));
memset(vis,0,sizeof(vis));
memset(flag1,0,sizeof(flag1));//全部初始化
for(i=0;i<n;i++)
scanf("%s",map[i]);
for(i=0;i<n;i++)
for(j=0;j<m;j++)
{
if(map[i][j]=='Y')
{
x1=i;
y1=j;
}
if(map[i][j]=='M')
{
x2=i;
y2=j;
}
}
vis[x1][y1]=1;
bfs(x1,y1,flag);//一遍BFS之后
memset(vis,0,sizeof(vis));//初始化
vis[x2][y2]=1;
bfs(x2,y2,flag1); //再跑一遍BFS。
int min=inf;
for(i=0;i<n;i++)
for(j=0;j<m;j++) //遍历整个地图、
{
if(min>flag[i][j]+flag1[i][j] &&flag[i][j] &&flag1[i][j])//有值的地方说明有KFC,找出两个人同时到达一个KFC的最短时间
min=flag[i][j]+flag1[i][j];
}
printf("%d\n",min*11);//每走一步为11分钟。
}
return 0;
}
原文:http://blog.csdn.net/sky_miange/article/details/43561785