广度优先搜索-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。
如果您觉得阅读本文对您有帮助,请点一下“推荐”按钮,您的“推荐”将是我最大的写作动力!欢迎各位转载,但是未经作者本人同意,转载文章之后必须在文章页面明显位置给出作者和原文连接,否则保留追究法律责任的权利。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 使用C#创建一个MCP客户端
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 按钮权限的设计及实现