进击高手【第四期】(bfs)

本文深入探讨宽度优先搜索(BFS)算法,包括定义、模板及应用实例。通过仙岛求药、营救等例题,展示了BFS在解决路径最短问题中的应用,并提供了解题思路和代码片段。此外,还介绍了乳草的入侵、围成面积等复杂问题的BFS解决方案。
摘要由CSDN通过智能技术生成

bfs

定义

宽度优先搜索算法(又称广度优先搜索)是最简便的图的搜索算法之一,这一算法也是很多重要的图的算法的原型。Dijkstra单源最短路径算法和Prim最小生成树算法都采用了和宽度优先搜索类似的思想。其别名又叫BFS,属于一种盲目搜寻法,目的是系统地展开并检查图中的所有节点,以找寻结果。换句话说,它并不考虑结果的可能位置,彻底地搜索整张图,直到找到结果为止。

模板

struct node{
   
	int x,y,step;//x,y都表示坐标 step表示步数
}t1,t2;
void bfs(int x,int y){
   
	queue <node> q;//一般为结构体
	t1.x=x,t1.y=y,t1.step=0;
	q.push(t1);//将t1输入
	while(!q.empty()){
   //一般为 在队列为空时退出
		t1=q.front(),q.pop();//访问第一个队列
		for(int i=0;i<4;i++){
   
			int nx=t1.x+d[i][0];
			int ny=t1.y+d[i][1];
			int nstep=t1.step+1;//求新的位置
			if(nx>=1&&nx<=m&&ny>=1&&ny<=n&&!vis[nx][ny]){
   
				vis[nx][ny]=1;
				t2.x=nx,t2.y=ny,t2.step=nstep;
				if(a[t2.x][t2.y]=='*'){
   //提前退出,可以不写
					return;
				}
				q.push(t2);//将t2输入
			}
		}
	}
}

例题

1.仙岛求药

题目描述

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

请添加图片描述

输入格式
输入有多组测试数据。每组测试数据以两个非零整数M和N开始,两者均不大于 。M表示迷阵行数,N表示迷阵列数。接下来有M行,每行包含N个字符,不同字符分别代表不同含义:

  • "@" :少年李逍遥所在的位置;
  • "." :可以安全通行的方格;
  • "#":有怪物的方格;
  • "*":仙药所在位置。

当在一行中读入的是两个零时,表示输入结束。

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

样例输入

8 8
.@##…#
#…#.#
#.#.##…
…#.###.
#.#…#.
…###.#.
…#.
.#…###
6 5
.
.#.
.#…
…##.

.#…
…@
9 6
.#…#.
.#.*.#
.####.
…#…
…#…
…#…
…#…
#.@.##
.#…#.
0 0

样例输出

10
8
-1

很经典,bfs必须学习。只要在模板上加上提前退出。

void bfs(int x,int y){
   
	queue <node> q;
	t1.x=x,t1.y=y,t1.step=0;
	q.push(t1);
	while(!q.empty()){
   
		t1=q.front();
		q.pop();
		for(int i=0;i<4;i++){
   
			int nx=t1.x+d[i][0];
			int ny=t1.y+d[i][1];
			int nstep=t1.step+1;
			if(nx>=1&&nx<=m&&ny>=1&&ny<=n&&!vis[nx][ny]){
   !!!!
				vis[nx][ny]=1;
				t2.x=nx,t2.y=ny,t2.step=nstep;
				if(a[t2.x][t2.y]=='*'){
   
					printf("%d\n",t2.step);
					f=1;
					return;
				}
				q.push(t2);
			}
		}
	}
}

2.营救

题目描述

铁塔尼号遇险了!他发出了求救信号。距离最近的哥伦比亚号收到了讯息,时间就是生命,必须尽快 赶到那里。
通过侦测,哥伦比亚号获取了一张海洋图。这张图将海洋部分分化成 个比较小的单位,其中用 标明的是陆地,用 标明是海洋。船只能从一个格子,移到相邻的四个格子。
为了尽快赶到出事地点,哥伦比亚号最少需要走多远的距离。

输入格式
第一行为 n,下面是一个的 n*n 矩阵,表示海洋地图。
最后一行为四个小于n的整数,分别表示哥伦比亚号和铁塔尼号的位置。

输出格式
哥伦比亚号到铁塔尼号的最短距离。

样例输入

3
001
101
100
1 1 3 3

样例输出

4

在上基础上简单修改即可

3.乳草的入侵

这道题十分有简单 ,就是输入很恶心

注意:
1.输入的第一个数是行,第二个数是列。这样一来,输入 M x MxMx 和 M y MyMy 的顺序也要改变。 (我就是在这里被卡爆了)
2.题目的输入中,行不是 1 ~ y ,是反向输入的,即 y ~ 1。

思路:
用 BFS 搜索,当队列清空后,说明已经搜索完了整个地图,就可以通计答案了。

#include <bits/stdc++.h>
using namespace std;

struct node {
   
    int x, y, step;
} t1, t2;
bool vis[105][105];
int dx[8]= {
   1,-1,0,0,1,-1,1
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值