题目大意:Y和M寻找最近的kfc(@)求最短路径是两人耗时最少;
解题思路:典型bfs,用三维数组记录@的最少步数。
注:三维数组初始化为最大值,因为可能有的@两人有人到不了;
代码:
#include <iostream>
#include <cstring>
#include <queue>
using namespace std;
int vis[205][205];
int dir[4][2]={1,0,-1,0,0,1,0,-1};
int dis[205][205][2];
char map[205][205];
struct node
{
int x,y,step;
};
int flag,n,m;
void bfs(int x,int y)
{ memset(vis,0,sizeof(vis));
node p;
p.x=x;
p.y=y;
p.step=0;
vis[p.x][p.y]=1;
queue<node>q;
q.push(p);
while(!q.empty())
{
p=q.front();
q.pop();
node tmp;
tmp=p;
for(int i=0;i<4;i++)
{
tmp.x=p.x+dir[i][0];
tmp.y=p.y+dir[i][1];
tmp.step=p.step+1;
if(tmp.x>=0&&tmp.x<n&&tmp.y>=0&&tmp.y<m&&!vis[tmp.x][tmp.y]&&map[tmp.x][tmp.y]!='#')
{
if(map[tmp.x][tmp.y]=='@')
{
dis[tmp.x][tmp.y][flag]=tmp.step;
//return ;
}
vis[tmp.x][tmp.y]=1;
q.push(tmp);
}
}
}
}
int main()
{
while(cin>>n>>m)
{
for(int i=0;i<n;i++)
for(int j=0;j<m;j++)
{cin>>map[i][j];
dis[i][j][0]=dis[i][j][1]=0xfffffff;
}
//memset(dis,0,sizeof(dis));
for(int i=0;i<n;i++)
{
for(int j=0;j<m;j++)
{
if(map[i][j]=='Y')
{
flag=0;
bfs(i,j);
}
if(map[i][j]=='M')
{
flag=1;
bfs(i,j);
}
}
}
int minn=0xfffffff;
for(int i=0;i<n;i++)
for(int j=0;j<m;j++)
{
if(map[i][j]=='@')
{
if(minn>(dis[i][j][0]+dis[i][j][1]))
minn=dis[i][j][0]+dis[i][j][1];
}
}
cout<<minn*11<<endl;
}
return 0;
}