迷宫问题
问题:
下图给出了一个迷宫的平面图,其中标记为 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 }
运行结果:
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 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 加持,客户体验更智能