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);
}
}
}
}
posted @   IoOozZzz  阅读(12)  评论(0编辑  收藏  举报  
相关博文:
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
点击右上角即可分享
微信分享提示