迷宫问题
问题:
下图给出了一个迷宫的平面图,其中标记为 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 }
运行结果:


                
            
        
浙公网安备 33010602011771号