老鼠出迷宫之递归回溯

老鼠出迷宫之递归回溯

1.设计思路

老鼠出迷宫之递归回溯

 2.创建迷宫

老鼠出迷宫之递归回溯

 3.策略(下->右->上->左)

老鼠出迷宫之递归回溯

package study;

public class Test02 {
    public static void main(String[] args) {
        //定义二维数组
        int[][] map = new int[8][7];
         //把第一行与最后一行设置为1
        for (int i = 0; i < 7; i++) {
            map[0][i] = 1;
            map[7][i] = 1;
        }
        //把第一列与最后一一列设置为1
        for (int i = 0; i < 8; i++) {
            map[i][0] = 1;
            map[i][6] = 1;
        }
        map[3][1] = 1;
        map[3][2] = 1;
        map[2][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();
        }
        MouseMaze mouseMaze = new MouseMaze();
        mouseMaze.Maze(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 MouseMaze{
    public boolean Maze(int[][] map,int i,int j){
        if(map[6][5] == 2){//代表走到终点,结束程序
            return true;
        }else {//如果还未走到终点,则继续走
            if(map[i][j] == 0){//二维数组组成的迷宫,1代表墙,0代表可以走
                map[i][j] = 2;//把此处的0改成2,标记已走过
                //下->右->上->左,测试回溯
                //回溯:如果上下左右都走不通,就返回,从新再走,并且直接跳过上一轮的第一步操作
                if (Maze(map,i + 1,j)){//下移
                    return true;
                    //到if(map[i][j] == 0)处,为true则map[i][j] = 2
                }else if (Maze(map,i,j + 1)){//右移
                    return true;
                }else if (Maze(map,i - 1,j)){//上移
                    return true;
                }else if (Maze(map,i,j - 1)){//左移
                    return true;
                }else {
                    map[i][j] = 3;//上下左右都走不通,就把此处改成3
                    return false;
                }
            }else {//如果不为0,那只能是1(墙),2(已走过),3(死路),如果为1/2/3则
                return false;
            }
        }
    } 
}
思路解析:
map是用二维数组按照1为墙0为路设置的,规则 0(可以走),1(不能走),2(表示走过),3(走过是死路)
1.首先接收传入的参数 mouseMaze.Maze(map,1,1) -> (1,1)
2.根据程序(1,1)此处为0,于是map[i][j] = 2,因为数组是引用类型,Maze方法和主方法都指向这个数组,所以0改为2
3.接下来执行策略,下->右->上->左,先走下移if (Maze(map,i + 1,j))
4.于是在栈中开新栈,来执行Maze(map,i + 1,j),也就是(1+1,2)=>(2,1)向下移,于是又重新走Maze方法,参数为(2,1)
5.如果策略(下->右->上->左)都走不通,则执行map[i][j] = 3;把此处走不通的地方2改为3
6.然后执行return false;这里返回给调用者,调用者是上一个方法
7.比如说是被if(Maze(map,i + 1,j))下移,调用的,因为走不通所以返回了false,则if(false)
8.那么这个if就不会执行,继续执行其他策略,这里也就是递归中的回溯(回溯:如果上下左右都走不通,就返回,从新再走,并且直接跳过上一轮的第一步操作)
9.以上是0的情况,如果遇到1,2,3,则return false;同上一步,把false返回至上一层的if中,则不会再走这个方向,继续其他策略直到找到路为止
10.当走到终点(6,5),则return true,开始返回,由最后一层一直向上一层返回true,因为策略中走通了都写为return true;也就是执行每一层方法体的内容
11.这也就是Maze方法的返回值boolean的作用,可以接收每一层的bool返回值,直到返回至第一层,于是第一层再把true返回给主方法,返回之后无需调用
12.此时Maze方法执行完控制台打印数组为已经走至终点的数组,已走通地方都为2,死路为3

老鼠出迷宫之递归回溯

 

上一篇:dfs题型二(迷宫问题)


下一篇:第十一章 运用广度优先搜索走迷宫