站外题求助:一关
  • 板块学术版
  • 楼主Chalage_2010
  • 当前回复9
  • 已保存回复9
  • 发布时间2023/2/1 13:57
  • 上次更新2023/10/24 02:14:23
查看原帖
站外题求助:一关
760690
Chalage_2010楼主2023/2/1 13:57

题目描述

暑假即将到来,你和你的朋友计划吃肯德基。但是在地图上有很多肯德基,所以你应该想办法选择一个。方法是:计算从你家到一个肯德基的距离,以及从你朋友那到这个肯德基,如果这个和是所有离肯德基得距离中最少的一个,那么你们选择这家。

输入格式
第一行包含两个整数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;
}

为什么会报错啊

2023/2/1 13:57
加载中...