代码浅析已在代码注释里,代码如下:
/*
*@author 旧梦吖
*@version 1.0
* 走迷宫问题
*/
public class Maze {
public static void main(String[] args) {
//先设置一个迷宫 2 代表 墙 X 代表 小老鼠起始位置 Y 代表终点 0 代表空地 (7*7)
/* 2 2 2 2 2 2 2
* 2 0 0 0 0 0 2
* 2 X 0 0 0 0 2
* 2 2 2 2 0 0 2
* 2 0 0 0 0 0 2
* 2 Y 0 2 0 0 2 ---->
* 2 2 2 2 2 2 2
* */
//初始化迷宫
//二维数组
int[][] arr = new int[7][7];
//墙
for(int i = 0; i < arr.length; i++){
arr[0][i] = 2;//上围墙
arr[6][i] = 2;//下围墙
arr[i][0] = 2;//左围墙
arr[i][6] = 2;//右围墙
}
//其他墙
arr[3][0] = 2;
arr[3][1] = 2;
arr[3][2] = 2;
arr[3][3] = 2;
arr[5][3] = 2;
//给地图和 小老鼠位置
move(arr,1 ,2);
//展示最后结果
show(arr);
}
//展示迷宫 2为 墙 3为正确路线 9 为 小老鼠尝试走过的路线但没行通
// PS:可以通过遍历把9都改为0更方便观看路线
public static void show(int[][] arr){
for(int i = 0; i < arr.length; i++){
for(int j = 0; j <arr[i].length; j++){
System.out.print(" " + arr[i][j]);
}
System.out.println();
}
}
//小老鼠走迷宫方法
/**
* @param arr 传入的地图
* @param x 小老鼠当前的左右位置 也就是数组的 int[][X];
* @param y 小老鼠当前的上下位置 也就是数组的 int[Y][];
* @return 用于返回,如果返回为真,则整条路线正确,如返回假,则错误路线的最后一个位置将被'堵住' 方便下一次判断不再进入此路线
*/
public static boolean move(int[][] arr,int x, int y ){
//停止方法 即到达了终点 设 3 为 小老鼠走过的路线 9则为尝试走过,但走不通,所以堵住为了下次不在尝试走 0空地可以走
if(arr[5][1] == 3) return true; //说明小老鼠走过位置到达了终点
if(arr[y][x] == 0) { //说明当前位置是空地,可以走
arr[y][x] = 3; // 走到这位置,将空地变成走过的路线
// 因为是递归,所以在选择方向走后会再选择走,一直到最后死路或者找到终点停止;在返回true,返回的true又给上一步的if句,
// 上一步的if句的返回又给上一步的上一步,如此,最后就都返回true,说明路线走通,只要有一个地方返回false,那么这个
// 路线就是走不通的意思,然后在最后走不通的位置上设置为 9 ,即 伪障碍物 ,目的是为了下次判断时不在进入判断,就不会循环了
// 就会尝试往别的方向走而不是一直往这个方向走,所以 伪障碍物是为了防止 走不通move方法再次进入if(arr[y][x] == 0)里里面
if(move(arr,x,y-1)) return true; //尝试向上走
if(move(arr,x+1,y)) return true; //尝试向右走
if(move(arr,x,y+1)) return true; //尝试向下走
if(move(arr,x-1,y)) return true; //尝试向左走
//如果上下左右都不成功 即 四个方向都是 来时的路 墙 伪障碍物 其中之一 , 则设置最后到达的位置变为 伪障碍物,方便下一次
//判断时不进入此条路线
arr[y][x] = 9; //设置伪障碍物
}
//说明不为空地
return false;
}
}