欢迎您访问 最编程 本站为您分享编程语言代码,编程技术文章!
您现在的位置是: 首页

迷宫问题的 JAVA 递归实现

最编程 2024-06-29 21:18:21
...

问题描述:如下图,小球从起始点找到出迷宫的点,红色为墙体,不可以走

迷宫.png

说明:

递归需要遵守的重要规则

  1. 执行一个方法时,就创建一个新的受保护的独立空间(栈空间)

  2. 方法的局部变量是独立的,不会相互影响, 比如 n 变量

  3. 如果方法中使用的是引用类型变量(比如数组),就会共享该引用类型的数据.

  4. 递归 必须向退出递归的条件逼近,否则就是无限递归,出现 *Error

  5. 当一个方法执行完毕,或者遇到 return,就会返回, 遵守谁调用,就将结果返回给谁,同时当方法执行完毕或者返回时,该方法也就执行完毕

//代码实现
/**
 * @author szw
 */
public class MiGong {
    public static void main(String[] args) {
        //建立一个8行7列二维数组充当地图
        int[][] map = new int[8][7];

        for (int j = 0; j < 7; j++) {
            map[0][j] = 1;
            map[7][j] = 1;
        }
        for (int i = 0; i < 8; i++) {
            map[i][0] = 1;
            map[i][6] = 1;
        }
        map[3][1] = 1;
        map[3][2] = 1;
        for (int i = 0; i < 8; i++) {
            for (int j = 0; j < 7; j++) {
                System.out.print(map[i][j] + " ");
            }
            System.out.println();
        }

        System.out.println("小球走过迷宫之后的地图:");
        find(map, 1, 1);

        //小球走过迷宫之后的地图
        for (int i = 0; i < 8; i++) {
            for (int j = 0; j < 7; j++) {
                System.out.print(map[i][j] + " ");
            }
            System.out.println();
        }
    }

    /**
     * 迷宫找路
     * 说明:0为未走过,1为墙体,2为走过,3为此点不能成为通路上的点
     * @param map 地图
     * @param i   i,j为其实位置
     * @param j
     * @return
     */
    public static boolean find(int[][] map, int i, int j) {
        //如果要找的位置,即map[6][5] 为2,说明路已找到,直接返回true
        if (map[6][5] == 2) {
            return true;
        } else {
            if (map[i][j] == 0) {
                map[i][j] = 2;
                //如果map[i][j] == 0,说明初始位置没有走过,可以走,标记为2,然后开始下一步(开始递归调用)
                // 按照 下->右->上->左 的顺序找路
                if (find(map, i + 1, j)) {
                    return true;
                } else if (find(map, i, j + 1)) {
                    return true;
                } else if (find(map, i - 1, j)) {
                    return true;
                } else if (find(map, i, j - 1)) {
                    return true;
                } else {
                    //说明此点走不通,标记为3,此时将结果返回到上一个调用栈,并开始回溯到上一个点,继续按照策略走
                    map[i][j] = 3;
                    return false;
                }
            } else {
                //说明map[i][j] != 0,那么就为1,2或3,即都走不通,直接返回false
                return false;
            }
        }
    }
}

测试结果:

最后的线路是根据策略生成的,例如此例中,是按照下->右->上->左的策略走的,不同的策略会生成不同的线路,也会产生一个最短路径的问题