3分钟搞懂广度优先搜索[BFS]
广度优先搜索
实现方式
- 队列
问题
求从左上角到右下角的最短路径
核心代码
q.push((node){0, 0, 1}); //预处理放入开始结点 while (!q.empty()) { //只要还有需要处理的结点 node cur = q.front(); //去除队首元素 q.pop(); //出队 vis[cur.x][cur.y] = true; //表示已经走过了 if (cur.x == 4 && cur.y == 4) { cout << cur.l << endl; break; //第一个到终点后停止循环 } node nt; //下一个结点 nt.l = cur.l + 1; for (int i = 0; i < 4; i++) { //判断四个方向 nt.x = cur.x + nx[i]; nt.y = cur.y + ny[i]; if (nt.x < 0 || nt.y < 0 || nt.x > 4 || nt.y > 4) { continue; //出界了继续判断下一个方向 } if (vis[nt.x][nt.y] == false && map[nt.x][nt.y] == 0) { q.push(nt); } } }
思路:
- 先放入头结点
- 只要有需要搜索的结点就进行循环(即队列不为空)
- 和深度优先搜素一样进行判断
- 区别是:每次的结点会放入队列中
- 如果走到重点,
break
停止循环
代码
#include <iostream> #include <queue> #include <vector> using namespace std; struct node { int x, y; //记录状态 int l; //记录第几次发散 }; //预处理放入地图 vector<vector<int>> map = { {0, 1, 1, 1, 1}, {0, 0, 0, 0, 0}, {0, 1, 1, 1, 0}, {0, 1, 0, 0, 0}, {0, 0, 0, 1, 0} }; vector<vector<bool>> vis = { {false,false,false,false,false}, {false,false,false,false,false}, {false,false,false,false,false}, {false,false,false,false,false}, {false,false,false,false,false} }; queue<node> q; int nx[4] = {0, 0, 1, -1}; int ny[4] = {1, -1, 0, 0}; int main() { q.push((node){0, 0, 1}); //预处理放入开始结点 while (!q.empty()) { //只要还有需要处理的结点 node cur = q.front(); //去除队首元素 q.pop(); //出队 vis[cur.x][cur.y] = true; //表示已经走过了 if (cur.x == 4 && cur.y == 4) { cout << cur.l << endl; break; //第一个到终点后停止循环 } node nt; //下一个结点 nt.l = cur.l + 1; for (int i = 0; i < 4; i++) { //判断四个方向 nt.x = cur.x + nx[i]; nt.y = cur.y + ny[i]; if (nt.x < 0 || nt.y < 0 || nt.x > 4 || nt.y > 4) { continue; //出界了继续判断下一个方向 } if (vis[nt.x][nt.y] == false && map[nt.x][nt.y] == 0) { q.push(nt); } } } }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· winform 绘制太阳,地球,月球 运作规律
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)