给定一个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()); }

最新文章

  1. python 入门笔记
  2. 【刷题笔记】--lintcode木头加工(java)
  3. 【C#】使用IExtenderProvider为控件添加扩展属性,像ToolTip那样
  4. Jmeter中通过BeanShell获取当前时间
  5. 博为iHospital-HIS医院信息系统产品系列
  6. MFC学习 事件临界区
  7. python基础学习笔记第二天 内建方法(s t r)
  8. HDU 2544 最短路【Bellman_Ford 】
  9. hdoj 1863 畅通工程
  10. Scale-up(纵向扩展) vs Scale-out(横向扩展)
  11. 高级UNIX环境编程7 进程
  12. iOS 更改启动视图
  13. UVALive - 3026:Period
  14. 【转】详解web.xml中元素的加载顺序
  15. OpenFlow 交换机与控制器交互步骤
  16. C#页面前台&lt;%%&gt;&lt;%#%&gt;&lt;%=%&gt;
  17. hdu-6319-单调队列
  18. HDU 1074 Doing Homework (dp+状态压缩)
  19. 【文文殿下】快速傅里叶变换(FFT)学习笔记
  20. P3648 [APIO2014]序列分割

热门文章

  1. 第二季第十天 es6新特性新特性
  2. Web API接口
  3. 吴裕雄--天生自然 pythonTensorFlow图形数据处理:循环神经网络预测正弦函数
  4. PAT甲级——1005.SpellItRight(20分)
  5. redis数据库写入数据时提示redis.exceptions.ResponseError错误
  6. python-django项目-Linux系统建立django项目_20191117
  7. 非线程安全的HashMap 和 线程安全的ConcurrentHashMap
  8. [Linux] Ubuntu 配置nfs
  9. CentOS-Samba服务安装与配置
  10. IIC通信控制的AD5259------在调试过程中遇到的奇葩问题