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