这个题仍然属于BFS题,要求是求出2个人能够在KFC相遇最小总时间,思路是2次进行BFS搜索,记录2个人到所有KFC的距离,然后枚举取最小值即可
需要注意的是,其中可能某些KFC需要穿过某些KFC~WA了很久
代码:
#include<cstdio>
#include<cstring>
#include<iostream>
#include<queue>
using namespace std;
const int maxn=211;
struct node
{
int x;
int y;
int ans;
};
int n,m,sx[3],sy[3],cur,movex[4]={1,-1,0,0},movey[4]={0,0,1,-1};
int ansa[maxn][maxn],ansb[maxn][maxn];
char map[maxn][maxn];
bool vis[maxn][maxn];
queue<node> q;
void BFS(int x,int y,int index)
{
memset(vis,0,sizeof(vis));
//q.push((node){x,y,0});
node ita;
ita.x=x;
ita.y=y;
ita.ans=0;
q.push(ita);
vis[x][y]=1;
while(!q.empty())
{
node v=q.front();
q.pop();
for(int i=0;i<4;i++)
{
int itx=v.x+movex[i];
int ity=v.y+movey[i];
if(map[itx][ity]=='#'||vis[itx][ity])
continue;
if(map[itx][ity]=='@')
{
vis[itx][ity]=1;
if(index==0)
ansa[itx][ity]=min(ansa[itx][ity],v.ans+1);
else
ansb[itx][ity]=min(ansb[itx][ity],v.ans+1);
}
vis[itx][ity]=1;
// q.push((node){itx,ity,v.ans+1});
node ita;
ita.x=itx;
ita.y=ity;
ita.ans=v.ans+1;
q.push(ita);
}
}
}
int main()
{
while(scanf("%d%d",&n,&m)!=EOF)
{
cur=0;
memset(ansa,0,sizeof(ansa));
memset(ansb,0,sizeof(ansb));
for(int i=1;i<=n;i++)
scanf("%s",map[i]+1);
for(int i=0;i<=n+1;i++)
map[i][0]=map[i][m+1]='#';
for(int i=0;i<=m+1;i++)
map[0][i]=map[n+1][i]='#';
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
if(map[i][j]>='Y'||map[i][j]=='M')
{
sx[cur]=i;
sy[cur++]=j;
if(cur==2)
break;
}
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
ansa[i][j]=ansb[i][j]=1<<28;
BFS(sx[0],sy[0],0);
BFS(sx[1],sy[1],1);
int ans=1<<30;
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
if(map[i][j]=='@'&&ansa[i][j]&&ansb[i][j])
ans=min(ans,ansa[i][j]+ansb[i][j]);
printf("%d\n",ans*11);
}
return 0;
}