仙岛求药(bfs)

题目

少年李逍遥的婶婶病了,王小虎介绍他去一趟仙灵岛,向仙女姐姐要仙丹救婶婶。叛逆但孝顺的李逍遥闯进了仙灵岛,克服了千险万难来到岛的中心,发现仙药摆在了迷阵的深处。迷阵由 M×N个方格组成,有的方格内有可以瞬秒李逍遥的怪物,而有的方格内则是安全。现在李逍遥想尽快找到仙药,显然他应避开有怪物的方格,并经过最少的方格,而且那里会有神秘人物等待着他。现在要求你来帮助他实现这个目标。

输入格式
第一行输入两个非零整数 M和 N,两者均不大于 20。M表示迷阵行数,N表示迷阵列数。接下来有M行, 每行包含 N个字符,不同字符分别代表不同含义:1) ‘@’:少年李逍遥所在的位置;2) ‘.’:可以安全通行的方格;3) ‘#’:有怪物的方格;4) ‘*’:仙药所在位置。

输出格式
输出一行,该行包含李逍遥找到仙药需要穿过的最少的方格数目(计数包括初始位置的方块)。如果他不可能找到仙药, 则输出 −1。

Sample Input
8 8
.@##…#
#…#.#
#.#.##…
…#.###.
#.#…#.
…###.#.
…#.
.#…###
Sample Output
10
Sample Input 2
6 5
.
.#.
.#…
…##.

.#…
…@
Sample Output 2
8
Sample Input 3
9 6
.#…#.
.#..#
.####.
…#…
…#…
…#…
…#…
#.@.##
.#…#.
Sample Output 3
-1
题意分析:
一个岛,有初始位置”@“,有终点位置“
”,’.‘表示能走,’#'表示不呢个走。
解题思路:
广搜,注意找到仙草位置坐标后要把仙草变成能走的路。

AC 代码

#include<iostream>
#include<cstring>

using namespace std;

struct no
{
	int x;
	int y;
	int s;
}qu[50000];
char mp[30][30];
int book[30][30];
int main()
{
	int n,m,bx,by,tx,ty;
	while(cin>>m>>n)
	{
		memset(book,0,sizeof(book));
		memset(mp,'\0',sizeof(mp));
		//memset(qu,0,sizeof(qu));
		for(int i=1; i<=m; i++)
			for(int j=1; j<=n; j++)
			{
				cin>>mp[i][j];
				if(mp[i][j]=='@')
					bx=i,by=j;
				if(mp[i][j]=='*')
				{
					tx=i,ty=j;
					mp[i][j]='.';
				}
					
			}
		int h,t;
		h=1,t=1;
		qu[t].x=bx;
		qu[t].y=by;
		qu[t].s=0;
		book[bx][by]=1;
		t++;
		int flag=0;
		int next[4][2]={{1,0},{0,1},{-1,0},{0,-1}};
		while(h<t)
		{
			
			for(int k=0; k<4; k++)
			{
				int xx=qu[h].x+next[k][0];
				int yy=qu[h].y+next[k][1];
				if(xx<1||xx>m||yy<1||yy>n) continue;
				if(mp[xx][yy]=='#') continue;
				if(mp[xx][yy]=='.'&&book[xx][yy]==0)
				{
					book[xx][yy]=1;
					qu[t].x=xx;
					qu[t].y=yy;
					qu[t].s=qu[h].s+1;
					t++;
				}
				if(xx==tx&&yy==ty){
					flag=1;
					break;
				}
			}
			if(flag==1) 
				break;
			h++; 
		}
		if(flag==1)
			cout<<qu[t-1].s<<endl;
		else
			cout<<"-1"<<endl;
	}
	
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值