java实现迷宫回溯问题

java实现迷宫回溯问题

代码实现

public class Demo {
    public static void main(String[] args) {
        // 创建一个二维数组,模拟迷宫
        int[][] map = new int[8][7];
        // 使用1表示墙
        // 上下
        for (int i = 0; i < map[0].length; i++) {
            map[0][i] = 1;
            map[(map.length - 1)][i] = 1;
        }
        // 左右
        for (int i = 0; i < map.length; ++i) {
            map[i][0] = 1;
            map[i][(map[0].length - 1)] = 1;
        }

        // 挡板
        map[3][1] = 1;
        map[3][2] = 1;

        System.out.println("原来的地图");
        for (int[] ints : map) {
            for (int i : ints) {
                System.out.print(i + "\t");
            }
            System.out.println();
        }


        // setWay(map, 1, 1);
        NewSetWay(map, 1, 1);

        System.out.println("找过路之后的地图");
        for (int[] ints : map) {
            for (int i : ints) {
                System.out.print(i + "\t");
            }
            System.out.println();
        }

    }

    /**
     * 题目:
     * 从[1,1]找到[6,5]
     * <p>
     * 思路:
     * 约定:
     * 当map[i][j]
     * 为0时说明该点没走过
     * 为1时说明走不通
     * 为2时说明通路可以走
     * 为3时说明已经走过,但是不通
     * <p>
     * 策略:
     * 1. 走法:下->右->上->左,走不通再回溯
     *
     * @param map 表示地图
     * @param i   从哪个位置找
     * @param j
     * @return 找到通路,返回true,否则false
     */
    public static boolean setWay(int[][] map, int i, int j) {
        // 找到
        if (map[6][5] == 2) {
            return true;
        } else {
            // 如果没找到
            // 按策略找
            if (map[i][j] == 0) {
                map[i][j] = 2;
                // 向下走
                if (setWay(map, i + 1, j)) {
                    return true;
                } else if (setWay(map, i, j + 1)) {
                    // 向右走
                    return true;
                } else if (setWay(map, i - 1, j)) {
                    // 向上走
                    return true;
                } else if (setWay(map, i, j - 1)) {
                    // 向左走
                    return true;
                } else {
                    // 走不通
                    map[i][j] = 3;
                    return false;
                }
            } else {
                // 如果是1,是墙
                // 如果是2,是走过了
                // 如果是3,走不通
                return false;
            }
        }
    }

    // 修改找路的策略,上,右,下,左
    public static boolean NewSetWay(int[][] map, int i, int j) {
        // 找到
        if (map[6][5] == 2) {
            return true;
        } else {
            // 如果没找到
            // 按策略找
            if (map[i][j] == 0) {
                map[i][j] = 2;

                if (NewSetWay(map, i - 1, j)) {
                    return true;
                } else if (NewSetWay(map, i, j + 1)) {
                    return true;
                } else if (NewSetWay(map, i + 1, j)) {
                    return true;
                } else if (NewSetWay(map, i, j - 1)) {
                    return true;
                } else {
                    map[i][j] = 3;
                    return false;
                }
            } else {
                return false;
            }
        }
    }
}
posted @ 2022-03-30 13:45  CoderCatIce  阅读(74)  评论(0编辑  收藏  举报