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