Bootstrap

Java[零基础学习](方法递归调用)老鼠出迷宫--应用实例

代码中由详细注释,不理解的留言

 // 此种使用 ,下→右→上→左,的找路策略,来确定该位置是否真的可以走通

public class MiGong {
    public static void main(String[] args){
        // 实现迷宫
        // 思路分析:
        // 创建一个二维数组用来表示地图,int[][] map = new int[8][7]
        // 规定map数组的元素值:0 - 表示可以走, 1 - 表示不可以走

        int[][] map = new int[8][7];

        // 将map数组的第一行跟最后一行设置成1,表示不可以走
        for (int i = 0;i < 7;i++){
            map[0][i] = 1;
            map[7][i] = 1;
        }

        // 将map数组的第一列跟最后一列设置成1,表示不可以走
        for (int i = 0;i < 8;i++){
            map[i][0] = 1;
            map[i][6] = 1;
        }

        // 单独对map[3][1]map[3][2]设置
        map[3][1] = 1;
        map[3][2] = 1;

        // 打印地图
        System.out.println("========当前地图情况========");
        for (int i = 0;i < map.length;i++){
            for (int j = 0;j < map[i].length;j++){
                System.out.print(map[i][j] + "   ");
            }
            System.out.println();
        }


        T2 test = new T2();
        test.findWay(map,1,1);
        System.out.println("==========查看地图情况========");
        for (int i = 0;i < map.length;i++){
            for (int j = 0;j < map[i].length;j++){
                System.out.print(map[i][j] + "   ");
            }
            System.out.println();
        }
    }
}

class T2{
    /*
    使用递归回溯的思想来解决老鼠出迷宫

    解读:
     1.findWay方法就是专门来找出迷宫的路径
     2.如果找到,就返回 TRUE ,否则返回false
     3.使用二维数组map,表示迷宫地图
     4.i,j就是老鼠的位置,初始化的位置为[1][1]
     5.因为我们是递归的找路,所以我们先规定,map数组的各个值的含义
     6.0——表示可以走,1——表示障碍物,2——表示可以走,3——表示走过,但是走不通是死路
     7.当map[6][5] = 2 就说明找到通路,就可以结束,否则就继续找
     8.先确定老鼠的找路策略,下、右、上、左,的顺序判断下一步走的方向
    */

    // 将地图map,以及老鼠的初始化位置传递给方法
    public boolean findWay(int[][] map,int i,int j){
        if (map[6][5] == 2){//找到了,map[6][5]为终点,终点值为2表示到达终点,
            return true;
        }else {
            if (map[i][j] == 0){// 当前这个位置为0;表示这个位置可以走
                // 当前位置可以走,将它设置为规定的数值
                map[i][j] = 2;
                // 利用递归回溯,在当前位置判断下一步该往哪里走,哪里可以走,依据下右上左的规则
                // 使用找路策略,来确定该位置是否真的可以走通
                if (findWay(map,i + 1,j)){// 下
                    return true;
                }else if (findWay(map,i,j + 1)){// 右
                    return true;
                }else if (findWay(map,i - 1,j)){// 上
                    return true;
                }else if (findWay(map,i,j - 1)){// 左
                    return true;
                }else {// map[i][j] = 1,2,3
                    map[i][j] = 3;
                    return false;
                }
            }else {
                return false;
                // 有的同学可能会想如果初始值为一个不为0的值,则老鼠一次也不执行,考虑到这个问题,
                // 老鼠固定起始位置[1][1]
            }
        }
    }

}

  // 此种使用 ,上→右→下→左,的找路策略,来确定该位置是否真的可以走通

更改确定该位置是否真的可以走通,的方法回溯语句

public class MiGong {
    public static void main(String[] args){
        // 实现迷宫
        // 思路分析:
        // 创建一个二维数组用来表示地图,int[][] map = new int[8][7]
        // 规定map数组的元素值:0 - 表示可以走, 1 - 表示不可以走

        int[][] map = new int[8][7];

        // 将map数组的第一行跟最后一行设置成1,表示不可以走
        for (int i = 0;i < 7;i++){
            map[0][i] = 1;
            map[7][i] = 1;
        }

        // 将map数组的第一列跟最后一列设置成1,表示不可以走
        for (int i = 0;i < 8;i++){
            map[i][0] = 1;
            map[i][6] = 1;
        }

        // 单独对map[3][1]map[3][2]设置
        map[3][1] = 1;
        map[3][2] = 1;

        // 打印地图
        System.out.println("========当前地图情况========");
        for (int i = 0;i < map.length;i++){
            for (int j = 0;j < map[i].length;j++){
                System.out.print(map[i][j] + "   ");
            }
            System.out.println();
        }


        T2 test = new T2();
        test.findWay(map,1,1);
        System.out.println("==========查看地图情况========");
        for (int i = 0;i < map.length;i++){
            for (int j = 0;j < map[i].length;j++){
                System.out.print(map[i][j] + "   ");
            }
            System.out.println();
        }
    }
}

class T2{
    /*
    使用递归回溯的思想来解决老鼠出迷宫

    解读:
     1.findWay方法就是专门来找出迷宫的路径
     2.如果找到,就返回 TRUE ,否则返回false
     3.使用二维数组map,表示迷宫地图
     4.i,j就是老鼠的位置,初始化的位置为[1][1]
     5.因为我们是递归的找路,所以我们先规定,map数组的各个值的含义
     6.0——表示可以走,1——表示障碍物,2——表示可以走,3——表示走过,但是走不通是死路
     7.当map[6][5] = 2 就说明找到通路,就可以结束,否则就继续找
     8.先确定老鼠的找路策略,下、右、上、左,的顺序判断下一步走的方向
    */

    // 将地图map,以及老鼠的初始化位置传递给方法
    public boolean findWay(int[][] map,int i,int j){
        if (map[6][5] == 2){//找到了,map[6][5]为终点,终点值为2表示到达终点,
                return true;
            }else {
//                if (map[i][j] == 0){// 当前这个位置为0;表示这个位置可以走
//                    // 当前位置可以走,将它设置为规定的数值
//                    map[i][j] = 2;
//                    // 利用递归回溯,在当前位置判断下一步该往哪里走,哪里可以走,依据下右上左的规则
//                    // 使用找路策略,来确定该位置是否真的可以走通
//                    if (findWay(map,i + 1,j)){// 下
//                        return true;
//                    }else if (findWay(map,i,j + 1)){// 右
//                        return true;
//                    }else if (findWay(map,i - 1,j)){// 上
//                        return true;
//                    }else if (findWay(map,i,j - 1)){// 左
//                        return true;
//                    }else {// map[i][j] = 1,2,3
//                        map[i][j] = 3;
//                        return false;
//                    }
//                }else {
//                    return false;
//                    // 有的同学可能会想如果初始值为一个不为0的值,则老鼠一次也不执行,考虑到这个问题,
//                    // 老鼠固定起始位置[1][1]
//                }
            if (map[i][j] == 0){// 当前这个位置为0;表示这个位置可以走
                // 当前位置可以走,将它设置为规定的数值
                map[i][j] = 2;
                // 利用递归回溯,在当前位置判断下一步该往哪里走,哪里可以走,依据下右上左的规则
                // 使用找路策略,来确定该位置是否真的可以走通
                if (findWay(map,i - 1,j)){// 上
                    return true;
                }else if (findWay(map,i,j + 1)){// 右
                    return true;
                }else if (findWay(map,i + 1,j)){// 下
                    return true;
                }else if (findWay(map,i,j - 1)){// 左
                    return true;
                }else {// map[i][j] = 1,2,3
                    map[i][j] = 3;
                    return false;
                }
            }else {
                return false;
                // 有的同学可能会想如果初始值为一个不为0的值,则老鼠一次也不执行,考虑到这个问题,
                // 老鼠固定起始位置[1][1]
            }
        }
    }

}

;