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);
}
}
}
}

浙公网安备 33010602011771号