返回顶部

广度优先搜索-BFS以及例题

题目

这是一道BFS

要在一张地图上从起点走到终点,首选广度优先搜索BFS,BFS通过队列来实现,队列能够让搜索有序地往下进行,BFS是向四周搜索,以广泛为其主要特点,相较深度优先搜索DFS,DFS用栈实现(栈符合其递归的性质),打个比方,是从起点出发,一条路走到没法走再回来走另一条路,而BFS相当于每一条路都先走一步看看,想象一滴水在一个迷宫里通过四处扩散找到出口,这就是广度优先搜索。

概念讲完了,接下来看这题怎么实现

从起点出发,将起点加入队列,用一个 while 循环来在队列不为空的时候(一旦队列为空就说明所有路都走过了)进行向四处扩散的操作,将队列头的元素取出来,通过一个 for 循环分别加上四个方向的偏移量得到四个方向的坐标,判断这四个方向是否走过,是否有障碍物,如果又没有障碍物又没走过,就将这个方向上的这一格标记为走过,接着再判断该点是否为终点,是的话就将实现定义好的 bool 变量改为一,代表能走到,如果不是终点就接着把这个可行的格子入队,留着之后再判这个格子的四方向。在队头元素的四个方向都判断完毕后,就可以弹出队头元素了,以上就是 BFS 函数的部分。

接下来看代码

复制代码
 1 #include <bits/stdc++.h>
 2 using namespace std;
 3 int n,m;
 4 bool vis[105][105];
 5 char ma[105][105];
 6 int f[4][2]={{1,0},{-1,0},{0,1},{0,-1}};//偏移量
 7 bool ok;//判断能不能走的bool
 8 struct node{
 9     int x,y;
10 };//每个位置的坐标结构体,广搜中结构体很好用
11 void bfs(int x,int y){//BFS部分
12     deque<node>q;//个人比效习惯用双端队列
13     q.push_back({x,y});//加入起点
14     vis[x][y]=1;//将起点标记为走过
15     while(!q.empty()){//判断队列是否为空
16         node now = q.front();//取队头元素
17         for(int i = 0;i < 4;i++){//加上偏移量
18             node next;//下一次要走的
19             next.x = now.x+f[i][0];
20             next.y = now.y+f[i][1];
21             if(ma[next.x][next.y]!='#'&&vis[next.x][next.y]==0
22                 &&next.x<=n&&next.x>=1&&next.y<=m&&next.y>=1){//判断是否障碍物,是否走过,是否越界
23                 if(next.x==n&&next.y==m){//判断是否到终点
24                     ok=1;//能走
25                 }
26                 vis[next.x][next.y]=1;//标记为走过
27                 q.push_back(next);//入队
28             }
29         }
30         q.pop_front();//将队头元素弹出
31     }
32 }
33 int main(){//主函数
34     cin >> n >> m;
35     for(int i = 1;i <= n;i++){
36         for(int j = 1;j <= m;j++){
37             cin >> ma[i][j];//输入地图
38         }
39     }
40     bfs(1,1);//广搜
41     if(ok)cout << "Yes";
42     else cout << "No";//判断是否能走到,广搜结束ok仍等于零就说明没找到
43     return 0;//结束QWQ
44 }
复制代码

第一篇文章QwQ。



如果您觉得阅读本文对您有帮助,请点一下“推荐”按钮,您的“推荐”将是我最大的写作动力!欢迎各位转载,但是未经作者本人同意,转载文章之后必须在文章页面明显位置给出作者和原文连接,否则保留追究法律责任的权利。
posted @   铭Mingci  阅读(28)  评论(0编辑  收藏  举报
编辑推荐:
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 使用C#创建一个MCP客户端
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示