一篇入门广度优先搜索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。

详细步骤

  1. 初始化
    • 选择一个起始顶点作为遍历的起点。
    • 创建一个队列(Queue)用来存放待访问的顶点。
    • 创建一个集合(或使用其他数据结构)用来存放已经访问过的顶点,以避免重复访问。
  2. 开始遍历
    • 将起始顶点放入队列中。
    • 将起始顶点标记为已访问。
  3. 循环处理
    • 当队列不为空时,进行以下操作: a. 从队列的头部取出一个顶点,记为当前顶点。 b. 对当前顶点的所有未被访问过的邻接点进行以下操作: i. 将邻接点标记为已访问。 ii. 将邻接点放入队列的尾部。 c. 重复步骤b,直到当前顶点的所有邻接点都被访问过。
  4. 结束条件
    • 当队列为空时,算法结束。此时,所有从起点可达的顶点都被访问过了。

例题:
给定一个 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;
}

posted @   尼丝  阅读(6)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具
点击右上角即可分享
微信分享提示