ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

走迷宫

2021-04-13 10:36:14  阅读:147  来源: 互联网

标签:11 00 int 短路 迷宫 include dp


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

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

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

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

输入格式

第一行包含两个整数 nn 和 mm。

接下来 nn 行,每行包含 mm 个整数(00 或 11),表示完整的二维数组迷宫。

输出格式

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

数据范围

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 的 2 的 3 的走
dp最问题是 特殊的最短路问题 最短路包含dp

所有边权都是1 时, 用bfs最短路
其它有专门的最短路

 

初始状态 放queue
while queue !empty()
{
队头给t
t扩展
}

 1 /*
 2 宽搜 搜最短路 : 一圈一圈 层层的走  所有距离为1 的  2 的 3 的走
 3 dp最问题是 特殊的最短路问题  最短路包含dp
 4 
 5 所有边权都是1 时, 用bfs最短路
 6 其它有专门的最短路
 7 
 8 */
 9 
10 /*
11 初始状态 放queue
12 while queue !empty()   
13 {
14     队头给t
15     t扩展
16 }
17 */
18 
19 
20 #include <iostream>
21 #include <cstring>
22 #include <algorithm>
23 // #include <queue>  手写队列
24 
25 using namespace std;
26 
27 const int N =  110;
28 
29 typedef long long LL;
30 typedef pair<int,int> PII;
31 
32 int n, m;
33 int g[N][N];    // 存储地图
34 
35 int d[N][N]; // 存储 每个点到起点的距离
36 
37 
38 PII q[N * N]; // 手写队列
39 
40 int dx[]= {-1,0,1,0}, dy[]={0,1,0,-1};  // 向量表示 四个方向
41 int bfs()
42 {
43     int hh = 0, tt =0;  // 队头队尾
44     q[0] = {0,0};  // 起点
45     
46     memset(d, -1, sizeof d); //初始化距离 表示-1没有走过
47     d[0][0] = 0;
48     
49     
50     while(hh <= tt)
51     {
52         auto t = q[hh ++]; // 每次取出队头
53         
54         //尝试四个方向扩展
55         for(int i = 0 ; i<4 ; i++)
56         {
57             // 沿着当前方向走 到那个点
58             int x = t.first + dx[i],  y = t.second + dy[i];
59             if(x >=0 && x <n && y >= 0 && y <m  && g[x][y]==0 && d[x][y]== -1) // =0空地可以走的 , =-1没有走过
60             {//第一次搜到的是最短距离, 如果不是第一次搜到就不是最短
61                 d[x][y] = d[t.first][t.second] + 1;
62                 q[++ tt] = {x,y};
63             }
64         }
65     }
66     return d[n-1][m-1]; // 输出右下角的点
67     
68 }
69 
70 int main()
71 {
72     
73     cin >> n >> m;
74     
75     // 读图
76     for(int i = 0; i< n ;i++)
77         for(int j = 0; j<m; j++)
78         {
79             cin >> g[i][j];  
80         }
81     cout << bfs();
82     
83     
84     return 0;
85 }

 

   

标签:11,00,int,短路,迷宫,include,dp
来源: https://www.cnblogs.com/leoaioliabao/p/14652006.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有