[AcWing]844. 走迷宫(C++实现)模板题

  • 1. 题目
  • 2. 读题(需要重点注意的东西)
  • 3. 解法
  • 4. 可能有帮助的前置习题
  • 5. 所用到的数据结构与算法思想
  • 6. 总结

1. 题目

2. 读题(需要重点注意的东西)

思路:用宽度优先搜索的思想,先将路口的节点弹出队列,然后站在该路口向前后左右四个方向看,将能走的节点加到队列中,用一个二维数组d[N][N]存储各个节点到首节点的距离。由于bfs具有最短性,因此直接输出左下角到右下角的最短的路径。

3. 解法

---------------------------------------------------解法---------------------------------------------------

#include <cstring>
#include <iostream>
#include <algorithm>
#include <queue>using namespace std;typedef pair<int, int> PII;const int N = 110;int n, m;
// 用g来存储图,d来存储各个节点到起始节点的路径
int g[N][N], d[N][N];int bfs()
{// 定义一个队列q来存储最新到达的地点,队首出队的时候,也是走向下一个节点的时候queue<PII> q;// 将距离d首先初始化为-1memset(d, -1, sizeof d);// 初始化起始节点的距离d[0,0] = 0d[0][0] = 0;// 将起始节点加到队列中q.push({0, 0});// 定义四个方向int dx[4] = {-1, 0, 1, 0}, dy[4] = {0, 1, 0, -1};// 如果队列不为空while (q.size()){// 将队首元素赋值给tauto t = q.front();// 队首出队q.pop();// 站在这个路口,向前后左右四个方向看(这个求向左走(x-1,y)、向右走(x+1,y)、向上走(x,y-1)、向下走(x,y+1)的写法可以背下来)for (int i = 0; i < 4; i ++ ){// t为队首元素,即当前路口的x值,t.first为x轴的值,t.first + dx[i]为向左右走// t为队首元素,即当前路口的y值,t.second为y轴的值,t.second + dy[i]为向上下走int x = t.first + dx[i], y = t.second + dy[i];// 如果如果坐标(x,y)合法(在给定图的范围内)且能走(g[x][y] == 0)且没有走过(d[x][y] == -1)if (x >= 0 && x < n && y >= 0 && y < m && g[x][y] == 0 && d[x][y] == -1){// 将这个位置(x,y)到起始点(0,0)的距离(在上一步的距离+1(d[t.first][t.second] + 1))加到d[x][y]中d[x][y] = d[t.first][t.second] + 1;// 将这个新到达的位置加入队列q.push({x, y});}}}// 输出右下角(n-1,m-1)到起始点的距离d[n - 1][m - 1]即可// 因为bfs有最短性,所有直接输出就是左上角到右下角的最短的路径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;
}

4. 可能有帮助的前置习题

5. 所用到的数据结构与算法思想

6. 总结

bfs的应用之一,需要掌握好bfs的思想是每次都把下一层能遍历的节点全部遍历一遍这个思想。

[AcWing]844. 走迷宫(C++实现)bfs的思想相关推荐

  1. DFS和BFS概念及实践+acwing 842 排列数字(dfs) +acwing 844. 走迷宫(bfs)

    DFS (深搜), 也有说就是递归的 执着: 一直搜到底,然后回溯下一个节点 数据结构 : stack (这里的栈,实际上是编译器内部的栈, 所以说也可以看成递归, 递归内部也是调用编译器内部栈) 空 ...

  2. acwing——844. 走迷宫

    acwing--844. 走迷宫 给定一个n*m的二维整数数组,用来表示一个迷宫,数组中只包含0或1,其中0表示可以走的路,1表示不可通过的墙壁. 最初,有一个人位于左上角(1, 1)处,已知该人每次 ...

  3. AcWing 844. 走迷宫

    原题链接如下: AcWing 844. 走迷宫 题目如下: 给定一个 n×m 的二维整数数组,用来表示一个迷宫,数组中只包含 0 或 1,其中 0 表示可以走的路,1 表示不可通过的墙壁. 最初,有一 ...

  4. AcWing 844.走迷宫

    844. 走迷宫 - AcWing题库 就是要我们求最短路,可以用bfs. 那么这题目,如果用dfs会有什么情况. bfs用队列实现,对于为何用队列实现.可以看一下这篇文章[图解算法]BFS 为什么需 ...

  5. AcWing 844. 走迷宫(迷宫问题+最短路径+BFS+最短路径输出)

    题目描述: 给定一个 n×m 的二维整数数组,用来表示一个迷宫,数组中只包含 0 或 1,其中 0 表示可以走的路,1 表示不可通过的墙壁. 最初,有一个人位于左上角 (1,1) 处,已知该人每次可以 ...

  6. Acwing.844 走迷宫(BFS)

    题目 给定一个n'm的二维整数数组,用来表示一个迷宫,数组中只包含0或1,其中0表示可以走的路,1表示不可通过的墙壁. 最初,有一个人位于左上角(1,1)处,已知该人每次可以向上.下.左.右任意一个方 ...

  7. AcWing 844. 走迷宫(BFS or DP)

    题目链接 https://www.acwing.com/problem/content/description/846/ 思路 直接用BFS跑一个最短路就好了,因为边权都是为1的,并且每次只有四个方向 ...

  8. acwing算法基础课 844. 走迷宫

    acwing 844. 走迷宫(bfs模板题) 传送门 题目大意:给你一个n * m的矩阵问你从左上角走到右下角最小需要几步,输出步数,其中矩阵里面只包含0和1两个数字,0表示可以走,1表示有障碍 思 ...

  9. 里奥老师乾坤大挪移—深入浅出走迷宫问题之BFS算法1

    还是要从经典的走迷宫问题开始 DFS的思路是只选择一个方向,一条路走到黑,不撞南墙不回头. 而BFS的思路,每一步在走之前,我都要把所有的选择,所有的方向全看一遍,一层一层的往外扩展. 显然DFS比B ...

最新文章

  1. 7-20 打印九九口诀表 (C语言)
  2. websocket(二):SSM+websocket的聊天室
  3. 性能测试工具curl-loader(linux)
  4. 整理JS+FLASH幻灯片播放图片脚本代码
  5. 第二百一十九天 how can I 坚持
  6. c语言 自动化编译环境,《C编程.开始C》3.编译基础
  7. 升级版的数据透视表!用一工具,做出了HR羡慕的人力数据分析
  8. JavaScript 设计模式核⼼原理与应⽤实践 之 结构型设计模式
  9. pip安装wxpython报错_Ubuntu 上搭建robotframework
  10. linux 内核优化
  11. angular 点菜_JavaScript实现的select点菜功能示例
  12. N1盒子使用T1遥控和电视一起开关机以及按键设置
  13. Java 前后端分离部署方式
  14. vmware服务器虚拟化 pdf,VMware数据中心服务器虚拟化解决方案模板_V0.pdf
  15. 转行做程序员,月薪过万需要多久?
  16. 3.19百度移动端 一连三面
  17. std::accumulate的用法
  18. linux系统横杆,linux横杠怎么打
  19. python从入门到弃坑中子弹部分的问题
  20. FFT快速傅里叶变换C语言实现信号处理 对振动信号进行实现时域到频域的转换

热门文章

  1. 计算机实验员技能大赛,“迎接挑战”计算机技能大赛圆满结束!
  2. 神奇的CSS用法之border-radius
  3. 大数据平台架构技术选型与场景运用
  4. b500k带开关电位器内部构造_b500k开关摇杆电位器,直滑电位器103
  5. ACCESS备件管理数据库分类出入库改进
  6. 详解温度传感器DS18B20编程与使用
  7. 统计学 分布篇 - Binomial Distribution(二项分布)
  8. 包教包会—全网最易懂的全加器高位进位和低位进位讲解
  9. android设置路由器,如何在Android手机上设置无线路由器以实现WiFi互联网访问
  10. estore网上书城项目分享