找到小菇凉(BFS)

99 篇文章 0 订阅
37 篇文章 0 订阅

找到小菇凉

Time Limit:1000MS  Memory Limit:65536K
Total Submit:80 Accepted:13

Description

天凉了,小菇凉天天被扇子妈关在家里不让她到处跑。小菇凉觉得很无聊。这天,趁着扇子妈出门,小菇凉偷偷溜出门去玩。因为太久没出门太开心了,小菇凉一不小心就跑到了很远的地方,很晚都没有回家。扇子妈妈很担心,于是找到小光头问他是否看到小菇凉。小光头知道小菇凉会跑到很远的森林里去玩,于是决定帮扇子妈去找小菇凉。天色已经很晚了,小光头希望尽快找到小姑凉。

Input

输入第一行两个整数N,M(1 <= N,M <= 1000)表示森林的大小。 
接下来一个N*M的矩阵由“#”,“.”组成。“#”表示该地为高灌木,小光头不能通过。“.”表示该地为空地,小光头能通过。地图上仅有一个“A”表示小姑凉的位置,一个“B”表示小光头的位置。

Output

当小光头能看到小菇凉时(即小光头和小菇凉在同行或同列,中间没有障碍时)表示小光头找到了小菇凉。若小光头能找到小菇凉,输出最快找到小菇凉的时间。若不能找到小菇凉,输出No!!!

Sample Input

5 5
...A#
##...
..B##
#####
.....

Sample Output

2


AC code:

#include<iostream>
#include<stdio.h>
#include<map>
#include<vector>
#include<queue>
#include<set>
#include<cstdlib>
#include<string.h>
#include<algorithm>
#include<cmath>
#define MAXN 1000010
#define EPS 1e-9
using namespace std;

struct node{
	int x;
	int y;
	int sp;
}sta[1000010];

int n,m;
int dir[4][2]={0,1,0,-1,-1,0,1,0};
char ma[1001][1001];
int vis[1001][1001];

void BFS(int x,int y,int dx,int dy)
{
	queue<node>q;
	int xx,yy,ok,i,j;
	memset(vis,0,sizeof(vis));
	node cur,nex;
	cur.x=x;
	cur.y=y;
	cur.sp=0;
	q.push(cur);
	vis[x][y]=1;
	while(!q.empty())
	{
		cur=q.front();
		q.pop();
		xx=cur.x;
		yy=cur.y;
		ok=0;
		if(xx==dx)
		{
			for(j=yy;j>=0;j--)
			{
				if(ma[xx][j]=='A')
				{
					ok=1;
					break;
				}
				else if(ma[xx][j]=='#')
					break;
			}
			for(j=yy+1;j<m;j++)
			{
				if(ma[xx][j]=='A')
				{
					ok=1;
					break;
				}
				else if(ma[xx][j]=='#')
					break;
			}
		}
		else if(yy==dy)
		{
			for(j=xx;j>=0;j--)
			{
				if(ma[j][yy]=='A')
				{
					ok=1;
					break;
				}
				else if(ma[j][yy]=='#')
					break;
			}
			for(j=xx+1;j<n;j++)
			{
				if(ma[j][yy]=='A')
				{
					ok=1;
					break;
				}
				else if(ma[j][yy]=='#')
					break;
			}
		}
		if(ok)
		{
			printf("%d\n",cur.sp);
			return;
		}
		for(i=0;i<4;i++)
		{
			nex.x=xx+dir[i][0];
			nex.y=yy+dir[i][1];
			nex.sp=cur.sp+1;
			if(nex.x>=0&&nex.x<n&&nex.y>=0&&nex.y<m&&ma[nex.x][nex.y]!='#'&&!vis[nex.x][nex.y])
			{
				q.push(nex);
				vis[nex.x][nex.y]=1;
			}
		}
	}
	printf("No!!!\n");
} 

int main()
{
//	freopen("D:\\in.txt","r",stdin);
	int i,j,sx,sy,dx,dy;
	while(scanf("%d%d",&n,&m)!=EOF)
	{
		for(i=0;i<n;i++)
		{
			scanf("%s",ma[i]);
			for(j=0;j<m;j++)
			{
				if(ma[i][j]=='A')
				{
					dx=i;
					dy=j;
				}
				else if(ma[i][j]=='B')
				{
					sx=i;
					sy=j;
				}
			}
		}
		BFS(sx,sy,dx,dy);
	}
	return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

林下的码路

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值