Java教程

走迷宫

本文主要是介绍走迷宫,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

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

 

这篇关于走迷宫的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!