一篇入门广度优先搜索BFS
注:本篇博客参考《算法图解》,读者阅读BFS一篇时大受启发所以想要记录下来并搭配例题给网友分享。
BFS 解决的问题
- 从节点A出发,有前往节点B的路径吗?
- 从节点A出发,前往节点B的哪条路径最短?
- 应用:图的遍历搜索,最短路径,层级遍历,网络爬虫等
一个例子 + 一个例题搞懂BFS
把人和人的关系想象成一个网,假设 A 认识B,C,D。而 B 认识E,F,G。那么A就能通过 B 来找到E,F,G。也就是说从 A 出发可以经过 B 到达E,F,G。
详细步骤:
- 初始化:
- 选择一个起始顶点作为遍历的起点。
- 创建一个队列(Queue)用来存放待访问的顶点。
- 创建一个集合(或使用其他数据结构)用来存放已经访问过的顶点,以避免重复访问。
- 开始遍历:
- 将起始顶点放入队列中。
- 将起始顶点标记为已访问。
- 循环处理:
- 当队列不为空时,进行以下操作: a. 从队列的头部取出一个顶点,记为当前顶点。 b. 对当前顶点的所有未被访问过的邻接点进行以下操作: i. 将邻接点标记为已访问。 ii. 将邻接点放入队列的尾部。 c. 重复步骤b,直到当前顶点的所有邻接点都被访问过。
- 结束条件:
- 当队列为空时,算法结束。此时,所有从起点可达的顶点都被访问过了。
例题:
给定一个 N×M 的网格迷宫 G。G 的每个格子要么是道路,要么是障碍物(道路用 1 表示,障碍物用 0 表示)。已知迷宫的入口位置为 (x1,y1),出口位置为 (x2,y2)。问从入口走到出口,最少要走多少个格子。
输入第 1 行包含两个正整数 N,M,分别表示迷宫的大小。下来输入一个 N×M 的矩阵。最后一行输入四个整数 x1,y1,x2,y2,表示入口的位置和出口的位置。1 ≤ N,M ≤ 100
输入:
5 5
1 0 1 1 0
1 1 0 1 1
0 1 0 1 1
1 1 1 1 1
1 0 0 0 1
1 1 5 5
输出:
8
答案
#include <bits/stdc++.h>
using namespace std;
int dx[4] = {0, 1, 0, -1};
int dy[4] = {1, 0, -1, 0};
struct point{
int x;
int y;
int step;
};
queue<point> r;
int a[110][110], v[110][110];
int n, m, startx, starty, endx, endy;
int main()
{
// 初始化地图
cin >> n >> m;
for(int i=1; i<=n; i++) {
for(int j=1; j<=m; j++) {
cin >> a[i][j];
}
}
cin >> startx >> starty >> endx >> endy;
// 初始化起点
point start;
start.x = startx;
start.y = starty;
start.step = 0;
// 标记起点已经走过
v[startx][starty] = 1;
//创建完这个点然后就是使用这个点压入队列里面
r.push(start);
int flag = 0;
while(!r.empty()) {
int x = r.front().x;
int y = r.front().y;
// 判断是否为终点,如果是就输出结果
if (x == endx && y == endy) {
flag = 1;
cout << r.front().step;
break;
}
// 将该点上下左右合格的点放入队列
for(int k=0; k<4; k++) {
int tmpx, tmpy;
tmpx = r.front().x + dx[k];
tmpy = r.front().y + dy[k];
if (a[tmpx][tmpy] == 1 && v[tmpx][tmpy] == 0)
{
point tmppoint;
tmppoint.x = tmpx;
tmppoint.y = tmpy;
tmppoint.step = r.front().step + 1;
r.push(tmppoint);
v[tmpx][tmpy] = 1;
}
}
r.pop();
}
if (flag == 0) cout << "-1";
return 0;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具