广度优先搜索
BFS,其英文全称是 Breadth First Search,意为广度优先搜索,是所有的搜索手段之一。它是从某个状态开始,将所有节点加入一个先进先出的队列,然后一层一层进行状态转移,并且展开节点。
广度优先搜索基本概念
作为搜索算法的一种,BFS 相较于 DFS 而言,BFS 是一层一层展开的,那么对于有多个终态时,最先找到的一定是最短的。
广度优先搜索算法的设计步骤
按照定义设计:
- 确定该题目的状态(包括边界)
- 找到状态转移方式
- 找到问题的出口,计数或者某个状态
- 设计搜索
会发现我们前期要找到的参数基本一致,所以在一般情况下 BFS 和 DFS 可以相互转换。
伪代码:
int check(参数)
{
if(满足条件)
return 1;
return 0;
}
bool pd(参数){
相应操作
}
void bfs()
{
1. 把根节点放入队列尾端
2. 每次从队列中取出一个节点
3. Check 判断是不是答案,如果是结束算法 return;
4. 把当前取出的节点扩展,如果扩展后的节点经Pd()后符合要求,就放入队列,不符合就不放。
5. 转到步骤2,循环执行
}
如果所有节点被扩展完了,没有找到答案就无解。
BFS原理
BFS搜索的原理:逐层扩散,从起点出发,按层次从近到远,逐层先后搜索
编码:用队列实现
应用:BFS一般用于求最短路径问题,BFS的特点是逐层搜索,先搜到的层离起点更近
BFS:找最短路径
找从@到*最短路径
![![[Pasted image 20240310221548.png]]](https://i-blog.csdnimg.cn/blog_migrate/228ab6cf397ccaa2e322d9d1dd9ef59b.png)
![![[Pasted image 20240310221602.png]]](https://i-blog.csdnimg.cn/blog_migrate/3ea31f35cc9fc8021adc612d429d427e.png)
![![[Pasted image 20240310221659.png]]](https://i-blog.csdnimg.cn/blog_migrate/c5ea9f620e5df6a1d747c3cba7032564.png)
![![[Pasted image 20240310221710.png]]](https://i-blog.csdnimg.cn/blog_migrate/51d6b183cf7aafdeebb29a26ca68d497.png)
| 步骤 | 出队列 | 进队列 | 当前队列内的点 |
|---|---|---|---|
| (1) | 1 | 1 | |
| (2) | 1 | 2、3 | 2、3 |
| (3) | 2 | 4、5、6 | 3、4、5、6 |
| (4) | 3 | 7、8 | 4、5、6、7、8 |
最短路径问题用BFS
BFS的特点:逐层扩散
- 往BFS的队列中加入邻居结点时,按距离起点远近的顺序加入,先加入距离起点为1的邻居结点,加完之后,再加入距离为2的邻居结点,等等
- 搜完一层,才会继续搜下一层
最短路径:从起点开始,沿着每一层逐步往外走,每多一层,路径长度就增加1。
所有长度相同的最短路径都是从相同的层次扩散出去的
搜到第一个到达终点的路径,就是最短路径
长草
题目链接
难度: 简单
标签: 模拟, BFS, 2020, 省模拟赛
题目描述:
小明有一块空地,他将这块空地划分为 n 行 m 列的小块,每行和每列的长度都为 1。
小明选了其中的一些小块空地,种上了草,其他小块仍然保持是空地。
这些草长得很快,每个月,草都会向外长出一些,如果一个小块种了草,则它将向自己的上、下、左、右四小块空地扩展,
这四小块空地都将变为有草的小块。请告诉小明,k 个月后空地上哪些地方有草。
输入描述:
输入的第一行包含两个整数 n,m。
接下来 n 行,每行包含 m 个字母,表示初始的空地状态,字母之间没有空格。如果为小数点,表示为空地,如果字母为 g,表示种了草。
接下来包含一个整数 k。 其中,2≤n,m≤1000,1≤k≤1000
输出描述:
输出 n 行,每行包含 m 个字母,表示 k 个月后空地的状态。如果为小数点,表示为空地,如果字母为 g,表示长了草。
输入输出样例:
示例:
输入:
4 5
.g...
.....
..g..

最低0.47元/天 解锁文章
1701

被折叠的 条评论
为什么被折叠?



