#include <iostream>
#include <queue>
#include <cstring>
using namespace std;
int dx[]={0,0,1,-1};
int dy[]={1,-1,0,0};
int m,n;
char map[222][222];//输入的
int yyy[222][222];//Y移动的次数
int mmm[222][222];//M移动的次数
int yx,yy,mx,my;
struct node
{
int x,y;
};
int bfs(int x,int y,int num[222][222])
{
queue<node>q;
node aa,bb;
aa.x=x;
aa.y=y;
num[x][y]=0;
q.push(aa);
while(!q.empty())
{
aa=q.front();
q.pop();
for(int i=0;i<4;i++)
{
bb.x=aa.x+dx[i];
bb.y=aa.y+dy[i];
if(bb.x>=0&&bb.x<n&&bb.y>=0&&bb.y<m&&num[bb.x][bb.y]==0&&map[bb.x][bb.y]!='#')//该位置满足行走条件
{
num[bb.x][bb.y]=num[aa.x][aa.y]+1;
q.push(bb);
}
}
}
}
int main()
{
while(cin>>n>>m)
{
for(int i=0;i<n;i++)
{
for(int j=0;j<m;j++)
{
cin>>map[i][j];
if(map[i][j]=='Y')//对两人开始位置进行标记,并由这进行广搜
{
yx=i;
yy=j;
}
else if(map[i][j]=='M')
{
mx=i;
my=j;
}
}
}
memset(yyy,0,sizeof(yyy));
memset(mmm,0,sizeof(mmm));
bfs(yx,yy,yyy);//对俩人都进行一次广搜,
bfs(mx,my,mmm);
int minn=100000;
for(int i=0;i<n;i++)
{
for(int j=0;j<m;j++)
{
if(map[i][j]=='@'&&yyy[i][j]!=0)//确保该位置走过,第二个条件写成mmm[i][j]!=0也可
{
minn=min(minn,yyy[i][j]+mmm[i][j]);//计算两者走过的最小次数
}
}
}
cout<<minn*11<<endl;
}
return 0;
}
J - Find a way(bfs)
最新推荐文章于 2021-07-30 10:27:17 发布