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