https://vjudge.net/contest/389717#problem/F
分析:裸的BFS不用优化剪枝也能过。。。
比赛的时候竟然打错了一堆东西。。。
具体的思路就是从两人的家开始遍历走两次BFS
之后遍历一遍去寻找KFC位置并取其中的最小值
#include<iostream>
#include<cstdio>
#include<cstring>
#include<queue>
using namespace std;
const int maxn=205;
char mp[maxn][maxn];
int n,m,yx,yy,mx,my;
int vis[maxn][maxn];
int dir[4][2]={0,1,1,0,-1,0,0,-1};
int mstep[maxn][maxn],ystep[maxn][maxn];
struct node
{
int x,y;
};
void bfs(int sx,int sy,int flag)
{
node start,next;
int i,j;
queue<node>q;
start.x=sx;
start.y=sy;
vis[sx][sy]=1;
mstep[sx][sy]=0;
ystep[sx][sy]=0;
q.push(start);
while(!q.empty())
{
start=q.front();
q.pop();
for(i=0;i<4;i++)
{
next.x=start.x+dir[i][0];
next.y=start.y+dir[i][1];
if(next.x<1||next.x>n||next.y<1||next.y>m) continue;
if(mp[next.x][next.y]!='#'&&vis[next.x][next.y]==0)
{
vis[next.x][next.y]=1;
q.push(next);
if(flag==1) ystep[next.x][next.y]=ystep[start.x][start.y]+1;
else mstep[next.x][next.y]=mstep[start.x][start.y]+1;
}
}
}
return;
}
int main()
{
int i,j,mn;
while(cin>>n>>m)
{
mn=99999;
for(i=1;i<=n;i++)
{
for(j=1;j<=m;j++)
{
cin>>mp[i][j];
if(mp[i][j]=='Y')
{
yx=i;
yy=j;
}
if(mp[i][j]=='M')
{
mx=i;
my=j;
}
}
}
memset(vis,0,sizeof(vis));
bfs(yx,yy,1);
memset(vis,0,sizeof(vis));
bfs(mx,my,2);
for(i=1;i<=n;i++)
{
for(j=1;j<=m;j++)
{
if(mp[i][j]=='@')
{
mn=min(mn,mstep[i][j]+ystep[i][j]);
}
}
}
printf("%d\n",mn*11);
}
return 0;
}