迷宫问题

问题:

下图给出了一个迷宫的平面图,其中标记为 1 的为障碍,标记为 0 的为可
以通行的地方。
010000
000100
001001
110000
迷宫的入口为左上角,出口为右下角,在迷宫中,只能从一个位置走到这
个它的上、下、左、右四个方向之一。


第一种方案(最短路径):
对于上面的迷宫,从入口开始,可以按DRRURRDDDR 的顺序通过迷宫,
一共 10 步。

第二种方案(不是最短路径):

这里我的代码只能走到右下角,但并不是以最少的步数走到的。(用了12步)

其中 D、U、L、R 分别表示向下、向上、向左、向右走。
请你用程序实现以上走迷宫的步骤

 

思路:递归求解

 

直接上代码:

复制代码
 1 public class Maze {
 2     private static int[][] maze = {
 3             {0,1,0,0,0,0},
 4             {0,0,0,1,0,0},
 5             {0,0,1,0,0,1},
 6             {1,1,0,0,0,0},
 7     };
 8 
 9     /**
10      * 0 代表还没走
11      * 1 代表墙
12      * 2 代表已经走过,走的通
13      * 3 代表已经走过,走不通
14      * 规定走的顺序:先右、然后下、再左、最后上
15      * @param i
16      * @param j
17      * @return
18      */
19     public static boolean mazeReCall(int i, int j) {
20         if (maze[3][5] == 2) {
21             return true;
22         }
23 
24         // 边界索引越界
25         if (i < 0 || i >= maze.length || j < 0 || j >= maze[i].length ) {
26             return false;
27         }
28 
29         // 看这个点有没有走过,没有就可以走,即maze[i][j] = 0
30         if (maze[i][j] == 0) {
31             // 初始认为该点不是死路,即设置为2,然后去判断自己的四个方向是否有可通的路
32             maze[i][j] = 2;
33             if (mazeReCall(i, j + 1)) {
34                 //
35                 return true;
36             } else if (mazeReCall(i + 1, j)) {
37                 //
38                 return true;
39             } else if (mazeReCall(i, j - 1)) {
40                 //
41                 return true;
42             } else if (mazeReCall(i - 1, j)) {
43                 //
44                 return true;
45             } else {
46                 // 上下左右都走不通,将该点设置为3,即死路
47                 maze[i][j] = 3;
48                 return false;
49             }
50         } else {
51             // 不为0就直接返回false,表示走不通,此时可能为1、2、3
52             /*
53                 什么是死路?就是三个方向都走不通的路,即为思路(注意:不是四个方向都走不通才为思路)
54                 这里2为什么也返回false呢?因为我们知道一个死胡同(即死路)是有一个进去的方向,另外三个方向都走不通
55             不然如果2也能走的话,那么就会无限次的来回走这个点,无限判断,无限返回,就不跟现实相符了。
56             但是这里为啥不将其置为3,认为是死路呢?因为后面判断完另外三个方向以后都不行的话,最后还要从这个为2的
57             点回溯到上一个点呢,如果置为3,当回溯到上一个点时,发现上一个点(即我自己)已经为3了,这就不对了。因为上
58             一个点它认为它自己还只是试探了一下当前点(即右方向),还有三个方向都没有试探完,当前点怎么能将上一个点强
59             制改为3(死路)呢、仔细想象,也是这么个道理。
60              */
61             return false;
62         }
63     }
64 
65     public static void main(String[] args) {
66         mazeReCall(0, 0);
67         for (int i = 0; i < maze.length; i++) {
68             for (int j = 0; j < maze[i].length; j++) {
69                 System.out.printf("%d ", maze[i][j]);
70             }
71             System.out.println();
72         }
73     }
74 }
复制代码

运行结果:

 

posted @   没有你哪有我  阅读(201)  评论(0编辑  收藏  举报
编辑推荐:
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
阅读排行:
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· DeepSeek在M芯片Mac上本地化部署
· 葡萄城 AI 搜索升级:DeepSeek 加持,客户体验更智能
点击右上角即可分享
微信分享提示