Java数据结构Day12--递归回溯解决迷宫问题

思路 

所谓递归,就是自己调用自己,让某个参数在一次又一次的调用之中向跳出递归的结果靠近

对于迷宫的问题,就是怎么判断哪里有墙,怎么判断这条路接下去能不能走通,而不是只考虑下一步.但是迷宫是一步一步走下去的,所以这就正好可以使用递归的思想.

我们可以设计一个递归的方法,把到达出口设置为跳出的条件,把下一条路能走通定义为true,不能走通就为false.如果针对下一步返回的是true,那程序就会在下一步的基础上再调用依次该方法,判断下一步的下一步能否走通,只要出现了走不通的情况,就会逐层返回flase.这就是代码的一个思路

整体代码

public class MiGong {
    public static void main(String[] args) {
        int[][] map = makeAMiGong();
        //在此迷宫中,出发点为map[1][1],终点为map[6][5]
        findWay(map,1,1);
        System.out.println("结果如下==================");
        for (int[] ints : map) {
            for (int anInt : ints) {
                System.out.print(anInt + "\t");
            }
            System.out.println();
        }
        //2的路线就是找到出口的路径
    }
    public static int[][] makeAMiGong(){
        ///用二维数组表示迷宫
        int[][] map = new int[8][7];
        //用1来表示墙
        for (int i = 0; i < map.length; i++) {
            for (int j = 0; j < map[i].length; j++) {
                if (i == 0 || i == map.length - 1 || j ==0 || j == map[i].length - 1)
                    map[i][j] = 1;
            }
        }
        map[3][1] = 1;
        map[3][2] = 1;
        System.out.println("创建了以下地图==============");
        for (int[] ints : map) {
            for (int anInt : ints) {
                System.out.print(anInt + "\t");
            }
            System.out.println();
        }
        return map;
    }
    //寻址方法
    //为了找到最短路径,所以搜索通路的顺序用下右上左的顺序
    public static boolean findWay(int[][] map,int x,int y) {
        //将走过的标为2
        if (map[6][5] == 2){
            return true;
        }else{
            if (map[x][y] == 0){
                //当前此点未走过
                //先将此点设为2
                map[x][y] = 2;
                //先向下
                if (findWay(map,x+1,y)){
                    //如果向下走可以走通
                    return true;
                }else if (findWay(map,x,y+1)){
                    //如果向下走可以走通
                    return true;
                }else if (findWay(map,x-1,y)) {
                    //如果向上走可以走通
                    return true;
                }else if (findWay(map,x,y-1)){
                    //如果向左走可以走通
                    return true;
                }else{
                    //发现是死路一条
                    map[x][y] = 3; //将当前点设为3,表示走过,但不通
                    return false;
                }
            }else{
                //如果该点已被走过或者为墙(不为0)
                return false;
            }
        }
    }
}


版权声明:本文为zznanyou原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。