acwing——844. 走迷宫

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

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

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

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

输入格式

第一行包含两个整数n和m。

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

输出格式

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

数据范围

1≤n,m≤1001≤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

程序代码1:

#include<iostream>
#include<queue>
#include<cstring>
using namespace std;const int N = 110;typedef pair<int,int> PII;int g[N][N];     //存储地图
int d[N][N];    //标记搜索到的点的距离
int n,m;    //地图的长宽 int bfs()
{queue<pair<int,int>> q;q.push({0,0});memset(d,-1,sizeof(d));       //距离初始化为-1表示没有走过d[0][0] = 0;int dx[4] = {-1,0,1,0}, dy[4] = {0,1,0,-1};  //x 方向的向量和 y 方向的向量组成的上、右、下、左    while(q.size()){PII t = q.front();q.pop();for(int i=0;i<4;i++)   //枚举4个方向{int x = t.first + dx[i], y =t.second + dy[i];  //x表示沿着此方向走会走到哪个点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.push({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;
}

程序代码(用数组模拟队列):

#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);//距离初始化为- 1表示没有走过d[0][0] = 0;//表示起点走过了int dx[4] = {-1,0,1,0}, dy[4] = {0,1,0,-1};//x 方向的向量和 y 方向的向量组成的上、右、下、左while(hh<=tt)//队列不空{PII t = q[hh++];//取队头元素for(int i=0;i<4;i++)//枚举4个方向{int x = t.first + dx[i], y = t.second + dy[i];//x表示沿着此方向走会走到哪个点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;
}

打印路径代码:

#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];//手写队列
PII Prev[N][N];int bfs()
{int hh = 0, tt = 0;q[0] = {0,0};memset(d,-1,sizeof d);//距离初始化为- 1表示没有走过d[0][0] = 0;//表示起点走过了int dx[4] = {-1,0,1,0}, dy[4] = {0,1,0,-1};//x 方向的向量和 y 方向的向量组成的上、右、下、左while(hh<=tt)//队列不空{PII t = q[hh++];//取队头元素for(int i=0;i<4;i++)//枚举4个方向{int x = t.first + dx[i], y = t.second + dy[i];//x表示沿着此方向走会走到哪个点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;//到起点的距离Prev[x][y] = t;q[++tt] = {x,y};//新坐标入队}}}int x = n - 1, y = m - 1;while(x || y) //有一个不d等于0 {cout<<x<<' '<<y<<endl;PII t = Prev[x][y];x = t.first, y = t.second;}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;
}

acwing——844. 走迷宫相关推荐

  1. [AcWing]844. 走迷宫(C++实现)bfs的思想

    [AcWing]844. 走迷宫(C++实现)模板题 1. 题目 2. 读题(需要重点注意的东西) 3. 解法 4. 可能有帮助的前置习题 5. 所用到的数据结构与算法思想 6. 总结 1. 题目 2 ...

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

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

  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. 844. 走迷宫 + BFS

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

最新文章

  1. vue-cli3.0 生产包去除console.log
  2. 多重继承和虚继承的内存布局
  3. 苏宁易购11.11:商品详情系统架构设计
  4. C++11 运行时变量类型判断
  5. ElementUI Container布局容器
  6. qt运行C语言后无显示,qt designer启动后不显示界面问题的原因与解决办法-站长资讯中心...
  7. Spring中的异步和事务性事件侦听器
  8. 以“基”取胜:戴尔科技云平台 释放企业新动能
  9. 浅谈Oracle中物理结构(数据文件等。。。)与逻辑结构(表空间等。。。。。)
  10. debian、ubuntu安装metasploit通用方法
  11. jw player 5去掉share,info,embed页面
  12. 批量替换文件字体,简体-繁体
  13. 模拟人生4中文免费版 电脑版
  14. 最大化印刷MES管理系统价值,提升印刷车间效率与质量
  15. errorreporting php,php-phpin的error_reporting 22527中的22527是什么
  16. 如何在电脑端写qq看点文章?如何在电脑端找QQ看点
  17. ltsc系统升级为服务器,微软宣布Windows Server 2022开始转向LTSC 不再发布半年频道更新...
  18. python网页爬虫菜鸟教程_【爬虫】菜鸟教程,支持翻页,存储
  19. 力扣1046-最后一块石头的重量(原汁原味利用排序,自己写的100% Java题解)
  20. Detectron测试过程(含关键点)

热门文章

  1. AppleScript(7) : 睡眠
  2. storm trident mysql,Storm Trident(一)官方Tutorial
  3. 剑指offter笔记
  4. 因跨域,post请求变options请求(vue)
  5. 何为Robocode
  6. 中国红薯淀粉市场供需现状调研及前景策略分析报告2022年版
  7. 电子信箱怎么样注册?邮箱格式怎么写?
  8. Elliptical Head Tracking Using Intensity Gradients and Color Histograms(1998)
  9. PYGAME初学笔记(pygame的导入)
  10. jsp 按照学号查找学生_怎样做才可以用JSP实现只输入姓名或学号就可以进行查询...