整体思路:
1.创建一个10*10的二维数组迷宫。
当前迷宫中二维数组的值:0代表从未走过,1代表障碍物,2代表已经走过,该点只能走一次,不能返回重走,3代表死路(上下左右试探的时候,遇到障碍物或者其他死路点或者已经走过的点,判断该点为死路)。
着重理解下 值为2的时候只能走一次
1)理解上,值为2,肯定要经过最终下,右,上,左方向进行了下一步的试探。所以路径就算回来了也不用再走了。因为能走通,第一次走的时候已经通了。
2)如果能再走,如果这条路走到最后又回来了,那不就导致死循环了。
2.设置障碍物
3.开始递归尝试路线。按照一个设定的下,右,上,左方向递归测试路线,直到找到最终路线。
下面是代码。
public static void main(String[] args) {
//创建一个10*10的迷宫
int[][] mazeArr = new int[10][10];
/*
* 开始给迷宫设置障碍物
*/
for (int i = 0; i < 10; i++) {
mazeArr[0][i] = 1;
mazeArr[9][i] = 1;
}
for (int i = 0; i < 10; i++) {
mazeArr[i][0] = 1;
mazeArr[i][9] = 1;
}
mazeArr[4][1] = 1;
mazeArr[4][2] = 1;
mazeArr[4][3] = 1;
mazeArr[3][3] = 1;
mazeArr[2][3] = 1;
mazeArr[2][2] = 1;
/*
*障碍物设置结束
*/
System.out.println("迷宫初始位置");
show(mazeArr);
tryWay(mazeArr,1,1);
System.out.println("走过之后--------------------------");
show(mazeArr);
System.out.println("打印的2就是走过的路线,3是死胡同");
}
//打印迷宫属性
public static void show(int[][] mazeArr){
for (int i = 0; i < mazeArr.length; i++) {
for (int j = 0; j < mazeArr[i].length; j++) {
System.out.print(mazeArr[i][j]+" ");
}
System.out.println();
}
}
//尝试路线方法
public static boolean tryWay(int[][] mazeArr,int i,int j){
if(mazeArr[8][8] == 2){//如果找到终点。直接返回true。
return true;
}
if(mazeArr[i][j] == 0){//只有当这个点从未走过时才走。注意看else
mazeArr[i][j] = 2; //假定该点可以走通!
//开始下,右,上,左 四次递归尝试。
if(tryWay(mazeArr, i+1, j)){
return true;
}else if(tryWay(mazeArr, i, j+1)){
return true;
}else if(tryWay(mazeArr, i-1 , j)){
return true;
}else if(tryWay(mazeArr, i, j-1)){
return true;
}else{//上面4次尝试 下,右,上,左都走不通了,说明死路。直接设置为3。
mazeArr[i][j] = 3;
return false;
}
}else{//1,障碍物,3,死胡同 2,从已经走过,这个点已经被走过了,所以设定不让再次走了。
return false;
}
}
}
下面是输出结果