广度优先算法专题---例题讲解+总结+技巧

个人的理解:广度优先搜索属于一种盲目搜寻法,目的是系统地展开并检查图中的所有节点,以找寻结果。换句话说,它并不考虑结果的可能位置,彻底地搜索整张图,直到找到结果为止。假如是在二维数组里面搜索,就是一变四,四遍十六等。

具体看一个BFS特别经典的例题:

题目连接:https://nanti.jisuanke.com/t/T1596

题目描述

蒜头君在你的帮助下终于逃出了迷宫,但是蒜头君并没有沉浸于喜悦之中,而是很快的又陷入了思考,从这个迷宫逃出的最少步数是多少呢?

输入格式

第一行输入两个整数 n 和 m,表示这是一个 n×m 的迷宫。

接下来的输入一个 nn 行 mm 列的迷宫。其中 'S' 表示蒜头君的位置,'*'表示墙,蒜头君无法通过,'.'表示路,蒜头君可以通过'.'移动,'T'表示迷宫的出口(蒜头君每次只能移动到四个与他相邻的位置——上,下,左,右)。

输出格式

输出整数,表示蒜头君逃出迷宫的最少步数,如果蒜头君无法逃出迷宫输出 −1。

数据范围

1 <= n, m ≤10。

输出时每行末尾的多余空格,不影响答案正确

样例输入1

3 4
S**.
....
***T

样例输出1

5

 解题思路:

1.这种求最短路径的一般都要用bfs搜索,用dfs的话一般会超时。

2.搜索的思路就是从起点开始开始搜素。首先搜索他的一圈(上下左右),符合条件的入队(代码中我用的数组代替的队列,效果是一样的),直到第一个点的四周都被搜索完了,再根据四周的符合条件的点作为起始点,再次搜索这个点四周的,所谓的一变四,四变十六就是这样来的。

3.在搜索中会用到一个标记数组,用来记录已经走过的点。这样就起到防止重复搜索的作用。

代码:

#include
using namespace std;
struct dd
{
	int x;//横坐标
	int y;//纵坐标
	int s;//步数 
}a[101];
int main()
{
	int i,j,k,n,m,book[10][10]={0};
	int head=1,tail=1,tx,ty,flag=0;
	int next[4][2]={0,1,1,0,0,-1,-1,0};//右下左上 
	char s[11][11];
	cin>>n>>m;
	for(i=0;i>s[i][j];
			if(s[i][j]=='S')
			{
				tx=i;
				ty=j;
			}
		}
	}
	a[tail].x=tx;
	a[tail].y=ty;
	a[tail].s=0;
	tail++;
	book[tx][ty]=1;
	while(head=n||ty<0||ty>=m)
				continue;
			if(book[tx][ty]==0&&s[tx][ty]!='*')
			{
				a[tail].x=tx;
				a[tail].y=ty;
				a[tail].s=a[head].s+1;
				tail++;
				book[tx][ty]=1;
			}
			if(s[tx][ty]=='T')
			{
				flag=1;
				break;
			}
		}
		if(flag==1)
			break;
		head++;
	}
	if(head==tail)
		cout<<-1<

相对于dfs来说,bfs的优势:

1.在一般情况下求最短路径的题,用dfs搜索的话,搜到终点的时候,路径不一定是最短的,还要进行回溯继续搜索。但是用bfs的话第一次搜到的答案就会是最短路径(特别关键,想想为啥)。这一点算是bfs好的地方,但有时候也有弊端,具体下面会说。

2.用bfs搜索,只要搜到答案就能直接结束程序,输出答案。但是dfs的话,就算搜到了答案也不能直接结束程序。

下面说两个bfs的扩展:

一.bfs+优先队列;

二.bfs+三维数组标记;

1.bfs+优先队列:

因为bfs搜索是会有一个顺序,假如在依次搜索点的时候,每个点的情况不一样,有的点可能会花费更多的时间。如果按照正常的搜索顺序,就不能保证从起始点开始搜索,依次搜索得到的每个点不是最优的,这样就需要我们的优先队列出场了

具体例子+详细讲解:https://blog.csdn.net/weixin_44820625/article/details/104133551

2.bfs+三维数组标记:

在搜索过程中,如果在搜索某些点时,需要花费一些代价,而且能付出的代价是有限的,那这样就不能一味地用二维数组进行标记,因为走不同的路,到达某个点得到的状态(到达的时间和剩余能付出的代价)是不一样的,这样正常的标记就不能解决问题了,这时候可以用三维数组进行标记,把能付出的代价算作第三维度,这样就能成功的解决问题了。

具体例子+讲解:https://blog.csdn.net/weixin_44820625/article/details/104136668

 真是越学,越发现学无止境!!!

你可能感兴趣的:(bfs)