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
思路:

换句人话------->初始化队列,While队列不为空,每次把队头(auto t = q.front()然后q.pop(或者 auto t = q[h++]))拿出来,然后拓展完成后t = (q.push({x,y}或者q[++t]={x,y});
#include<iostream>
#include<cstring> using namespace std; typedef pair<int,int> PII;//存储状态
const int N = ;
PII q[N*N];
int d[N][N];//存距离
int g[N][N];//存地图
int r,c;//行列 int bfs(){
int tt = ,hh = ;//定义队头,和队尾
q[] = {,};//初始化队列状态 memset(d,-,sizeof d);//将全部的地图初始化为-1,如果是0的话就是我们走过的单元 d[][] = ;//第一个初始化为0也就是走过的 int dx[] = {-,,,},dy[]={,,,-};//根据上右下左,表示移动的方向 while(hh <= tt){//当队头不为空
auto t = q[hh ++];//去头
for(int i = ;i < ;i++){//操作的四个方向
int x = t.first+dx[i],y = t.second+dy[i];//定义移动方向的坐标
if(x >= && x < r && y >= && y < c && g[x][y] == && d [x][y] == -){
d[x][y] = d[t.first][t.second] + ;// 状态拓展----难点就是d[t.first][t.second]是d[x][y]的前一个位置的最大距离emmmmm卡了我好久
q[++tt] = {x,y};//状态转移
}
}
}
return d[r - ][c - ];
} int main(){
scanf("%d%d",&r,&c);
for(int i = ;i < r;i++)
for(int j = ;j < c;j++)
scanf("%d",&g[i][j]); printf("%d",bfs()); }
#include<iostream>
#include<cstring>
#include<queue>//加上队列函数
using namespace std; typedef pair<int,int> PII;//存储状态
const int N = ;
int d[N][N];//存距离
int g[N][N];//存地图
int r,c;//行列
int bfs(){
queue<PII> q;
q.push({,});//初始化队列状态 memset(d,-,sizeof d);//将全部的地图初始化为-1,如果是0的话就是我们走过的单元 d[][] = ;//第一个初始化为0也就是走过的 int dx[] = {-,,,},dy[]={,,,-};//根据上右下左,表示移动的方向 while(q.size()){//当队头不为空
//去头
auto t = q.front();
q.pop();
for(int i = ;i < ;i++){//操作的四个方向
int x = t.first+dx[i],y = t.second+dy[i];//定义移动方向的坐标
if(x >= && x < r && y >= && y < c && g[x][y] == && d[x][y] == -){
d[x][y] = d[t.first][t.second] + ;// 状态拓展
q.push({x,y});//状态转移
}
}
}
return d[r - ][c - ];
} int main(){
scanf("%d%d",&r,&c);
for(int i = ;i < r;i++)
for(int j = ;j < c;j++)
scanf("%d",&g[i][j]); printf("%d",bfs()); }
Acwing 844.裸迷宫的更多相关文章
- ACWING 844. 走迷宫
地址 https://www.acwing.com/problem/content/description/846/ 给定一个n*m的二维整数数组,用来表示一个迷宫,数组中只包含0或1,其中0表示可以 ...
- 844. 走迷宫(bfs模板)
给定一个n*m的二维整数数组,用来表示一个迷宫,数组中只包含0或1,其中0表示可以走的路,1表示不可通过的墙壁. 最初,有一个人位于左上角(1, 1)处,已知该人每次可以向上.下.左.右任意一个方向移 ...
- 算法竞赛——BFS广度优先搜索
BFS 广度优先搜索:一层一层的搜索(类似于树的层次遍历) BFS基本框架 基本步骤: 初始状态(起点)加到队列里 while(队列不为空) 队头弹出 扩展队头元素(邻接节点入队) 最后队为空,结束 ...
- DP背包问题学习笔记及系列练习题
01 背包: 01背包:在M件物品中取出若干件物品放到背包中,每件物品对应的体积v1,v2,v3,....对应的价值为w1,w2,w3,,,,,每件物品最多拿一件. 和很多DP题一样,对于每一个物品, ...
- HDU1269 迷宫城堡(裸强连通分量)
Description 为了训练小希的方向感,Gardon建立了一座大城堡,里面有N个房间(N<=10000)和M条通道(M<=100000),每个通道都是单向的,就是说若称某通道连通了A ...
- HDU1269迷宫城堡(裸Tarjan有向图求强连通分量个数)
迷宫城堡Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submiss ...
- HDU 1272小希的迷宫(裸并查集,要判断是否构成环,是否是连通图)
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=1272 小希的迷宫 Time Limit: 2000/1000 MS (Java/Others) ...
- hdu - 1269 迷宫城堡 (强连通裸题)
http://acm.hdu.edu.cn/showproblem.php?pid=1269 判断一个图是不是强连通,缩点之后判断顶点数是不是为1即可. #include <iostream&g ...
- 51nod 1459 迷宫游戏(dij)
题目链接:51nod 1459 迷宫游戏 dij裸题. #include<cstdio> #include<cstring> #include<algorithm> ...
随机推荐
- let和var的区别
在JavaScript中,定义变量的关键词一般用var,但还有一种定义变量的关键词叫let.两者的作用域范围不一样,我们可以将var理解为定义的是一个全局变量,而let定义的是一个局部变量.故let常 ...
- Filezilla Xshell SecureFX Win10等无法拖放文件(本地或线上)解决办法
一.win10系统Filezilla Xshell SecureFX等无法拖放文件到线上服务器解决办法: 1.按窗口键+R,打开“运行”对话框:输入regedit回车 2.在注册表编辑器地址栏输入以下 ...
- 在Eclipse下远程调试Beagleboneblack
安装调试器 1. gdbserver 2. gdb-multiarch 建立工程 新建一个cpp工程,ToolChains选择Cross GCC 这里使用的是arm-linux-gnueabihf-的 ...
- 第04项目:淘淘商城(SpringMVC+Spring+Mybatis) 的学习实践总结【第五天】
https://pan.baidu.com/s/1bptYGAb#list/path=%2F&parentPath=%2Fsharelink389619878-229862621083040 ...
- debian8.8安装谷歌浏览器
第一步:下载: wget https://dl.google.com/linux/direct/google-chrome-stable_current_i386.deb //32位 wget h ...
- 【Java杂货铺】JVM#Class类结构
代码编译的结果从本地机器码转为字节码,是储存格式发展的一小步,却是编程语言的一大步.--<深入理解Java虚拟机> 计算机只认识0和1.所以我们写的编程语言只有转义成二进制本地机器码才能让 ...
- 5)关于CSS和js静态文件引入路径
(1)参考资料 thinkphp5手册 视图--->输出替换 (2)方法(1)在我们的application中,找到config.php,在里面输入这样的配置: <?php ...
- centos设置上网代理
假设我们要设置代理为 IP:PORT 1.网页上网网页上网设置代理很简单,在firefox浏览器下 Edit-->>Preferences-->>Advanced-->& ...
- 计算a^b==a+b在(l,r)的对数Codeforces Round #597 (Div. 2)
题:https://codeforces.com/contest/1245/problem/F 分析:转化为:求区间内满足a&b==0的对数(解释见代码) ///求满足a&b==0在区 ...
- 混合欧拉回路poj 1637 Sightseeing tour
把该图的无向边随便定向,计算每个点的入度和出度.如果有某个点出入度之差为奇数,那么肯定不存在欧拉回路.因为欧拉回路要求每点入度 = 出度,也就是总度数为偶数,存在奇数度点必不能有欧拉回路: 好了,现在 ...