AcWing 844. 走迷宫(迷宫问题+最短路径+BFS+最短路径输出)
题目描述:
给定一个 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 <bits/stdc++.h>
#define ios ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
#define int long long
#define endl '\n'
#define N 105
using namespace std;
const int inf=0x3f3f3f3f;
const double ex=1e-7;
const int mod=1e9+7;
int gcd(int a ,int b){ return b ? gcd(b,a%b) : a ;}
typedef pair<int,int>PII;//坐标点
int g[N][N],v[N][N];//初始图、点到起点的距离
PII pre[N][N];//每个点的前一个点
vector<PII>path;//路径
int n,m;
void bfs()
{queue<PII>q;memset(v,-1,sizeof(v));//到起点的距离初始为-1而不是0,方便区分是否已经走过q.push({1,1});//从起点开始搜索v[1][1]=0;//起点到起点的距离为0int dx[4]={0,0,-1,1},dy[4]={1,-1,0,0};//上下左右四个方向扩展while(q.size())//如果在此循环中未达到到终点则无解{PII t=q.front();//记录当前对头,即前一个点q.pop(); //将当前出队for(int i=0;i<4;i++){int x1=t.first+dx[i],y1=t.second+dy[i];//上下左右试探是否能前进if(x1>=1&&x1<=n&&y1>=1&&y1<=m&&!g[x1][y1]&&v[x1][y1]==-1) //是否在地图内,是否可以前进,是否已经有路径{v[x1][y1]=v[t.first][t.second]+1; //新点的距离为旧点距离+1pre[x1][y1]=t; //记录新点的前一点q.push({x1,y1}); //新点入队尾}}}//从终点出发回溯到起点/* int x=n,y=m;//该题未要求输出路径但需掌握while(x||y){path.push_back({x,y});PII t=pre[x][y];x=t.first,y=t.second;}reverse(path.begin(),path.end()); //路径逆转,起点在前,终点在后for(auto it :path ){cout <<it.first<<" "<<it.second<<endl;}*/cout <<v[n][m];//输出起点到终点的最短路径长度
}
signed main()
{ioscin >>n>>m;for(int i=1;i<=n;i++){for(int j=1;j<=m;j++){cin >>g[i][j];}}bfs();return 0;
}
AcWing 844. 走迷宫(迷宫问题+最短路径+BFS+最短路径输出)相关推荐
- [AcWing]844. 走迷宫(C++实现)bfs的思想
[AcWing]844. 走迷宫(C++实现)模板题 1. 题目 2. 读题(需要重点注意的东西) 3. 解法 4. 可能有帮助的前置习题 5. 所用到的数据结构与算法思想 6. 总结 1. 题目 2 ...
- DFS和BFS概念及实践+acwing 842 排列数字(dfs) +acwing 844. 走迷宫(bfs)
DFS (深搜), 也有说就是递归的 执着: 一直搜到底,然后回溯下一个节点 数据结构 : stack (这里的栈,实际上是编译器内部的栈, 所以说也可以看成递归, 递归内部也是调用编译器内部栈) 空 ...
- acwing——844. 走迷宫
acwing--844. 走迷宫 给定一个n*m的二维整数数组,用来表示一个迷宫,数组中只包含0或1,其中0表示可以走的路,1表示不可通过的墙壁. 最初,有一个人位于左上角(1, 1)处,已知该人每次 ...
- AcWing 844. 走迷宫
原题链接如下: AcWing 844. 走迷宫 题目如下: 给定一个 n×m 的二维整数数组,用来表示一个迷宫,数组中只包含 0 或 1,其中 0 表示可以走的路,1 表示不可通过的墙壁. 最初,有一 ...
- AcWing 844.走迷宫
844. 走迷宫 - AcWing题库 就是要我们求最短路,可以用bfs. 那么这题目,如果用dfs会有什么情况. bfs用队列实现,对于为何用队列实现.可以看一下这篇文章[图解算法]BFS 为什么需 ...
- Acwing.844 走迷宫(BFS)
题目 给定一个n'm的二维整数数组,用来表示一个迷宫,数组中只包含0或1,其中0表示可以走的路,1表示不可通过的墙壁. 最初,有一个人位于左上角(1,1)处,已知该人每次可以向上.下.左.右任意一个方 ...
- AcWing 844. 走迷宫(BFS or DP)
题目链接 https://www.acwing.com/problem/content/description/846/ 思路 直接用BFS跑一个最短路就好了,因为边权都是为1的,并且每次只有四个方向 ...
- acwing算法基础课 844. 走迷宫
acwing 844. 走迷宫(bfs模板题) 传送门 题目大意:给你一个n * m的矩阵问你从左上角走到右下角最小需要几步,输出步数,其中矩阵里面只包含0和1两个数字,0表示可以走,1表示有障碍 思 ...
- 信息学奥赛一本通 1254:走出迷宫 | OpenJudge NOI 2.5 6264:走出迷宫
[题目链接] ybt 1254:走出迷宫 OpenJudge NOI 2.5 6264:走出迷宫 [题目考点] 1. 广搜 迷宫问题 [解题思路] 广搜,迷宫问题模板题. 当数据量很小时,用深搜的方法 ...
最新文章
- 使用Gradle整合SpringBoot+Vue.js-开发调试与打包
- nginx lua 安装spdy
- [原]iOS中 Web 页面与 Native Code 的一种通信方式
- 编程之美2.1 求二进制中1的个数
- 用最少的机器支撑万亿级访问,微博6年Redis优化历程
- mysql在线检测失败_一则线上MySql连接异常的排查过程
- CSS基础必备知识点03
- window.parent与window.opener的区别与使用
- 音视频同步原理[ffmpeg]
- teechart绘制实时曲线_关于PIII曲线
- Bailian4137 最小新整数【Ad Hoc】
- 专升本英语作文信件类必背范文十篇
- pc端移动端布局有什么区别
- PhotoShop软件笔记
- 推荐给大家12款好用的电脑软件
- windows10 下 Haskell 环境搭建2020
- PP实施经验分享(24)——ECN应用及系统操作
- ahk写入excel单元格_输出excel数据到GUI 获取excel所有Sheet及字段 Autohotkey
- 斐波那契数列——兔子生兔子问题
- Google60款开源项目