1、概念
广度优先搜索(BFS,Breadth-First Search)是一种图遍历算法,它从图的起始节点开始,先访问所有与起始节点直接相连的邻居节点,然后再依次访问这些邻居节点的邻居,直到遍历完所有可以到达的节点。BFS通常使用队列来保存待访问的节点,确保先访问离起始节点近的节点,因此它能够找到从起始节点到任何其他节点的最短路径。
2、实战例子
走迷宫:迷宫大小n*m,每个点包含0或1,0表示可行,1表示无法通行,求从[1][1]到[n][m]的最少步数。
#include <iostream>
#include <cstring>
#include <queue>
using namespace std;
const int N = 110; // 定义常量N,最大支持的矩阵大小为110x110
int g[N][N]; // 存储输入的数据,代表地图(0表示可走,1表示障碍)
int f[N][N]; // 存储路径,从起点到达每个点的步数
int n, m; // n:地图的行数,m:地图的列数
typedef pair<int , int> PII; // 定义PII为整数对(pair<int, int>),用于存储坐标
void bfs(int a, int b) // 广度优先搜索函数,参数a、b是起点的坐标
{
queue<PII> q; // 创建队列,用于存储待访问的节点
q.push({a, b}); // 将起点入队
// BFS遍历过程
while (!q.empty()) // 队列不为空时,继续遍历
{
PII s = q.front(); // 取队列前端的元素
q.pop(); // 移除队列中的元素
g[s.first][s.second] = 1; // 标记当前点为已访问
// 定义四个方向的移动:上、右、下、左
int dx[4] = {0, 1, 0, -1}; // 行的变化
int dy[4] = {-1, 0, 1, 0}; // 列的变化
// 尝试向四个方向扩展
for (int i = 0; i < 4; i++)
{
// 计算新的坐标
int x = s.first + dx[i], y = s.second + dy[i];
// 判断新坐标是否可以走且未访问过
if (g[x][y] == 0)
{
g[x][y] = 1; // 标记为已访问
f[x][y] = f[s.first][s.second] + 1; // 记录到达新位置的步数
q.push({x, y}); // 将新位置加入队列,继续搜索
}
}
}
// 输出从起点(1,1)到终点(n,m)的最短路径长度
cout << f[n][m];
}
int main()
{
memset(g, 1, sizeof(g)); // 初始化g数组,全部设置为1,用于防止越界
cin >> n >> m; // 输入地图的行数n和列数m
for (int i = 1; i <= n; i++)
for (int j = 1; j <= m; j++)
cin >> g[i][j]; // 读取每个位置的值,0表示可走,1表示障碍
bfs(1, 1); // 从(1, 1)位置开始进行广度优先搜索
return 0;
}
难点:通过队列来存储待遍历的点,同时移除已经遍历过的点;