题目描述
暑假即将到来,你和你的朋友计划吃肯德基。但是在地图上有很多肯德基,所以你应该想办法选择一个。方法是:计算从你家到一个肯德基的距离,以及从你朋友那到这个肯德基,如果这个和是所有离肯德基得距离中最少的一个,那么你们选择这家。
输入格式
第一行包含两个整数n,m
接下来的n行,每行输入m个字符来表示地图。1 <= N,M<=200
'@'是你的位置
'#'是障碍
'F'表示肯德基
'&'表示您朋友的位置。
'.','F','@'和'&',这些位置都可以通过。
输出格式
如果你能找到一种方法来获得一些肯德基,输出你和你的朋友选择的最少路程,否则输出“Meeting cancelled”
样例输入1
4 4
@.#F
....
.#..
F..&
样例输出1
6
样例输入2
4 4
&.#F
....
.#..
F#.@
样例输出2
8
提示:
Meeting cancelled是指:没有任何一家肯德基可以让两人相约。
我的代码
#include<bits/stdc++.h>
using namespace std;
struct node{
int x,y,step;
}que[40005];
int head=1,tail=0,n,m,vis[205][205],ans1[205][205],ans2[205][205],ans=0x3f3f3f3f;
int fx,fy,bx,by;
char a[205][205];
int dx[4]={0,0,1,-1};
int dy[4]={1,-1,0,0};
void bfs1()
{
que[++tail]=node(fx,fy,0);
vis[fx][fy]=1;
ans1[fx][fy]=0;
while(head<=tail)
{
for(int i=0;i<4;i++)
{
int tx=que[head].x+dx[i];
int ty=que[head].y+dy[i];
if(tx>=1 and tx<=n and ty>=1 and ty<=m and vis[tx][ty]==0 and a[tx][ty]!='#')
{
que[++tail]=node{tx,ty,que[head].step+1};
vis[tx][ty]=1;
ans1[tx][ty]=que[head].step+1;
}
head++;
}
}
}
void bfs2()
{
que[++tail]=node(fx,fy,0);
vis[fx][fy]=1;
ans2[fx][fy]=0;
while(head<=tail)
{
for(int i=0;i<4;i++)
{
int tx=que[head].x+dx[i];
int ty=que[head].y+dy[i];
if(tx>=1 and tx<=n and ty>=1 and ty<=m and vis[tx][ty]!=-1)
{
que[++tail]=node{tx,ty,que[head].step+1};
vis[tx][ty]=1;
ans2[tx][ty]=que[head].step+1;
}
head++;
}
}
}
int main()
{
memset(ans1,-1,sizeof(ans1));
memset(ans2,-1,sizeof(ans2));
cin>>n>>m;
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
{
cin>>a[i][j];
if(a[i][j]=='@') fx=i,fy=j;
if(a[i][j]=='&') bx=i,by=j;
}
}
bfs1();
memset(vis,0,sizeof(vis));
head=1,tail=0;
bfs2();
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
{
if(a[i][j]=='F' and ans1[i][j]!=-1 and ans2[i][j]!=-1)
{
ans=min(ans,ans1[i][j]+ans2[i][j]);
}
}
}
if(ans==0x3f3f3f3f) cout<<"Meeting cancelled";
else cout<<ans;
return 0;
}
为什么会报错啊