• 迷宫回溯问题


    1、如果小球能到arr[6][5],说明通路找到
    2、约定:
    当arr[i][j]为0表示该点没有走过,为1表示墙,为2表示通路可以走,为3表示走过但是没有走通
    3、走迷宫时定义一个策略,"下->右->上->左",如果该点走不通,再回溯

    
    

    1、定义迷宫的大小以及墙壁 

    // 初始化迷宫大小
    int[][] arr = new int[8][7];
    // 给迷宫画墙
    for (int i = 0; i < 8; i++) {
        arr[i][0] = 1;
        arr[i][6] = 1;
    }
    for (int i = 0; i < 7; i++) {
        arr[0][i] = 1;
        arr[7][i] = 1;
    }
    arr[3][1] = 1;
    arr[3][2] = 1;

    2、 编写递归算法,给小球找路

    /**
     * 递归给小球找路
     *
     * @param arr 迷宫地图
     * @param i   小球坐标
     * @param j   小球坐标
     * @return
     */
    public static boolean setWay(int[][] arr, int i, int j) {
        // 找到了通路
        if (arr[6][5] == 2) {
            return true;
        } else {
            // 该点没有走过,按照下右上左的方式走
            if (arr[i][j] == 0) {//表示没有过
                /*假设该点是可以走的:按照策略"下->右->上->左"走*/
                arr[i][j] = 2;
                if (setWay(arr, i + 1, j)) { // 向下递归
                    return true;
                } else if (setWay(arr, i, j + 1)) { // 向下递归
                    return true;
                } else if (setWay(arr, i - 1, j)) {// 向上递归
                    return true;
                } else if (setWay(arr, i, j - 1)) {// 向左递归
                    return true;
                } else { // 都走不通
                    arr[i][j] = 3;
                    return false;
                }
            } else { // arr[i][j]!=0一定是1,3,两种情况,返回false
                return false;
            }
        }
    }

    3、完整代码:

    package Demo;
    
    /**
     * @author zhangzhixi
     */
    public class Test04_迷宫回溯问题 {
        public static void main(String[] args) {
            // 初始化迷宫大小
            int[][] arr = new int[8][7];
    
            // 给迷宫画墙
            for (int i = 0; i < 8; i++) {
                arr[i][0] = 1;
                arr[i][6] = 1;
            }
            for (int i = 0; i < 7; i++) {
                arr[0][i] = 1;
                arr[7][i] = 1;
            }
            arr[3][1] = 1;
            arr[3][2] = 1;
            /*原始迷宫*/
            System.out.println("===========================原始迷宫=======================");
            for (int[] ints : arr) {
                for (int anInt : ints) {
                    System.out.print(anInt + "	");
                }
                System.out.println();
            }
            System.out.println("===========================原始迷宫=======================");
    
            setWay(arr, 1, 1);
    
            /*走完后的迷宫*/
            System.out.println("===========================走完后的迷宫=======================");
            for (int[] ints : arr) {
                for (int anInt : ints) {
                    System.out.print(anInt + "	");
                }
                System.out.println();
            }
            System.out.println("===========================走完后的迷宫=======================");
    
        }
    
        /**
         * 递归给小球找路
         *
         * @param arr 迷宫地图
         * @param i   小球坐标
         * @param j   小球坐标
         * @return
         */
        public static boolean setWay(int[][] arr, int i, int j) {
            // 找到了通路
            if (arr[6][5] == 2) {
                return true;
            } else {
                // 该点没有走过,按照下右上左的方式走
                if (arr[i][j] == 0) {//表示没有过
    
                    /*假设该点是可以走的:按照策略"下->右->上->左"走*/
                    arr[i][j] = 2;
                    if (setWay(arr, i + 1, j)) { // 向下递归
                        return true;
                    } else if (setWay(arr, i, j + 1)) { // 向下递归
                        return true;
                    } else if (setWay(arr, i - 1, j)) {// 向上递归
                        return true;
                    } else if (setWay(arr, i, j - 1)) {// 向左递归
                        return true;
                    } else { // 都走不通
                        arr[i][j] = 3;
                        return false;
                    }
                } else { // arr[i][j]!=0一定是1,3,两种情况,返回false
                    return false;
                }
            }
        }
    }
    View Code

  • 相关阅读:
    奶酪工厂
    P1080 国王游戏(非高精版)
    【洛谷P2150】[NOI2015] 寿司晚宴
    【洛谷P3349】[ZJOI2016]小星星
    【洛谷P5785】[SDOI2012]任务安排
    【模板】严格次短路
    【洛谷P3647】[APIO2014]连珠线
    2021.10.27NOIP模拟总结
    【树形DP】CF1016F Road Projects
    2021CSP-S 总结
  • 原文地址:https://www.cnblogs.com/zhangzhixi/p/14384241.html
Copyright © 2020-2023  润新知