C++ 宽度优先搜索 || 模版题:走迷宫

这篇具有很好参考价值的文章主要介绍了C++ 宽度优先搜索 || 模版题:走迷宫。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

给定一个 n×m
的二维整数数组,用来表示一个迷宫,数组中只包含 0
或 1
,其中 0
表示可以走的路,1
表示不可通过的墙壁。

最初,有一个人位于左上角 (1,1)
处,已知该人每次可以向上、下、左、右任意一个方向移动一个位置。

请问,该人从左上角移动至右下角 (n,m)
处,至少需要移动多少次。

数据保证 (1,1)
处和 (n,m)
处的数字为 0
,且一定至少存在一条通路。

输入格式
第一行包含两个整数 n
和 m

接下来 n
行,每行包含 m
个整数(0
或 1
),表示完整的二维数组迷宫。

输出格式
输出一个整数,表示从左上角移动至右下角的最少移动次数。

数据范围
1≤n,m≤100
输入样例:
5 5
0 1 0 0 0
0 1 0 1 0
0 0 0 0 0
0 1 1 1 0
0 0 0 1 0
输出样例:
8

#include <iostream>
#include <cstring>
#include <algorithm>

using namespace std;

const int N = 110;

typedef pair<int, int> PII;

int n, m;
int g[N][N];
int d[N][N];
PII q[N * N];

int bfs()
{
    int hh = 0, tt = 0;
    q[0] = {0, 0};
    
    memset(d, -1, sizeof d);
    d[0][0] = 0;
    int dx[4] = {0, 1, 0, -1}, dy[4] = {1, 0, -1, 0};
    while(hh <= tt)
    {
        auto t = q[hh ++ ];
        for(int i = 0; i < 4; i ++ )
        {
            int x = t.first + dx[i], y = t.second + dy[i];
            if(x >= 0 && x < n && y >= 0 && y < m && g[x][y] == 0 && d[x][y] == -1)
            {
                d[x][y] = d[t.first][t.second] + 1;
                q[ ++ tt] = {x, y};
            }
        }
    }
    return d[n - 1][m - 1];
}


int main ()
{
    cin>>n>>m;
    for(int i = 0; i < n; i ++ )
        for(int j = 0; j < m; j ++ )
            cin>>g[i][j];
    
    cout<<bfs()<<endl;
    return 0;
}

1、在 BFS 过程中,d[x][y] 表示从起点 (0, 0) 到达坐标 (x, y) 的最短路径长度。初始时,d[0][0] 被设置为 0,表示起点本身。然后,BFS 逐步遍历周围的单元格,并在发现更短的路径时更新 d 数组。

在代码中,d[x][y] 的值是通过 d[t.first][t.second] + 1 计算得到的,其中 (t.first, t.second) 是队列中当前处理的点。这里 +1 表示从当前点到下一个相邻点的距离,因为每一步的移动距离都是 1。

由于 BFS 的性质,它首次遇到目标点时,已经保证是最短路径,因为 BFS 会先扩展所有距离为 1 的点,然后是距离为 2 的点,以此类推。因此,一旦到达目标点,d[n - 1][m - 1] 就是最短路径的长度。

这样的设计保证了在遍历过程中每个点的最短路径都会被计算,并且队列按照距离的递增顺序进行遍历。

2、while 循环运行直到队列为空,是指 BFS 算法的主循环。BFS(广度优先搜索)是一种图的遍历算法,用于在图或者二维矩阵中找到从起点到终点的最短路径。

具体来说,BFS通过队列来进行遍历,队列中存放的是待探索的节点。初始时,将起点加入队列,然后不断从队列中取出一个节点进行探索,将其相邻且未访问过的节点加入队列,如此往复,直到队列为空。

在这个代码中,q 是用于 BFS 的队列,hh 和 tt 分别表示队列的头和尾。q[hh] 表示队列头部的节点,q[tt] 表示队列尾部的节点。在这个具体的问题中,队列中存放的是二维坐标 (x, y),表示矩阵中的某个点。

主循环的 while (hh <= tt) 保证了在队列非空的情况下继续循环。循环的目的是不断地取出队头的节点,然后探索其相邻的未访问过的节点,将它们加入队列,依此类推,直到队列为空。这样,通过队列的广度优先搜索,算法会逐层地从起点向终点扩展,最终计算出每个点到起点的最短路径。

队列的变化是通过不断取出队头节点、探索相邻节点、将未访问的相邻节点加入队列来实现的。整个过程保证了所有可达的节点都被访问到,而且是按照从起点到终点的最短路径进行访问的。文章来源地址https://www.toymoban.com/news/detail-793252.html

到了这里,关于C++ 宽度优先搜索 || 模版题:走迷宫的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【图论--搜索篇】宽度优先搜索,广度优先搜索

    今日语录: 成功是一种心态,如果你相信自己能做到,那你已经迈出成功的第一步。

    2024年01月24日
    浏览(47)
  • 1739. 迷宫的所有路径-深度优先搜索-DFS

    代码:

    2024年01月20日
    浏览(41)
  • 1432 - 走出迷宫的最少步数-广度优先搜索BFS

    代码

    2024年01月20日
    浏览(83)
  • 深度优先搜索(DFS)和广度优先搜索(BFS)两种算法c++

    深度优先搜索(DFS)和广度优先搜索(BFS)是一种用于遍历或搜索树图的一种算法,在这个过程中保证图或数的每个结点被访问且仅被访问一次,再按照每个结点访问的顺序不同分为深搜和广搜。 本文只讨论这两种算法在搜索方面的应用! 深度优先搜索 ( Depth-First-Search,DFS )它 沿

    2024年02月13日
    浏览(51)
  • 为什么深度优先搜索可以判定简单图中是否有环,而宽度优先搜索不行?

    1,首先可以肯定的是,对于无向图而言,宽搜和深搜都能判断是否有环。 简要说明一下,假如一个无向图有环,那么在宽搜的过程中,能搜到已经访问过的结点。如果一个无向图没有环(参考无向树),那么它的宽度优先搜索过程中,是不会访问到已访问过的结点的。 对于

    2024年02月14日
    浏览(79)
  • 宽度有限搜索BFS搜索数及B3625 迷宫寻路 P1451 求细胞数量 B3626 跳跃机器人

    题目描述 机器猫被困在一个矩形迷宫里。 迷宫可以视为一个 n×m 矩阵,每个位置要么是空地,要么是墙。机器猫只能从一个空地走到其上、下、左、右的空地。 机器猫初始时位于 (1,1) 的位置,问能否走到 (n,m) 位置。 输入格式 第一行,两个正整数 n,m。 接下来 n 行,输

    2024年02月13日
    浏览(42)
  • 数据结构学习笔记——图的遍历算法(深度优先搜索和广度优先搜索)

    图的遍历指从图中某一顶点出发(任意一个顶点都可以作为访问的起始顶点),按照某种遍历方法,对图中所有的顶点访问一次且只访问一次。图与树不一样,其中一个顶点可能与多个顶点相连,所以需记录已访问过的顶点,当访问一个顶点后,考虑如何选取下一个要访问的

    2024年02月05日
    浏览(53)
  • 深度优先搜索(DFS)(算法笔记)

    本文内容基于《算法笔记》和官方配套练题网站“晴问算法”,是我作为小白的学习记录,如有错误还请体谅,可以留下您的宝贵意见,不胜感激。 深度优先搜索是一种枚举所有完整路径以遍历所有情况的搜索方法,总是以“深度”作为前进的。实现方式是有很多,最

    2024年02月08日
    浏览(53)
  • 【蓝桥杯Java组】用Java带你暴走迷宫—DFS深度优先搜索

    📖📖 走迷宫 一类的问题一般都是暴力搜索解决,搜索的方法有两种:深度优先(DFS)和广度优先(BFS),而提到DFS就离不开递归,涉及到递归的问题理解起来还是有难度的,代码编写不当很容易造成栈溢出。 🌻🌻今天就用三道 走迷宫 问题带你彻底搞懂怎么用DFS秒杀迷宫

    2023年04月11日
    浏览(41)
  • 【C++算法】dfs深度优先搜索(上) ——【全面深度剖析+经典例题展示】

    💃🏼 本人简介:男 👶🏼 年龄:18 📕 ps:七八天没更新了欸,这几天刚搞完元宇宙,上午一直练🚗,下午背四级单词和刷题来着,还在忙一些学弟学妹录制视频和准备开学一些事,一直没空出时间来,等 20号练完车,也马上开学了QAQ。不过今天倒是空出来一些时间,恰好这

    2024年02月02日
    浏览(44)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包