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