一、迷宫问题
package com.atguigu._06递归.迷宫问题;
/**
* 递归 ———— 迷宫问题
* @author xsmjz
* @create 2022-03-24-0:17
*/
public class MiGong {
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;
}
for (int i=0; i<8; i++){
map[i][0] = 1;
map[i][6] = 1;
}
map[3][1] = map[3][2] = 1;
//使用setWay找出终点
setWay(map,1,1);
}
/**
* 使用递归回溯来给小球找路
* 约定 :当 map[i][j] 0表示没走过, 1表示墙, 2表示通路可以走, 3表示已经走过,但是走不通
* 策略: 下 => 右 => 上 => 左
* @param map 表示地图
* @param x x,y 表示寻找的起始位置
* @param y
* @return 找到返回 true,地图右下角非墙壁位为终点 map[ 行数-2 ][ 列数-2 ]
*/
public static boolean setWay(int[][] map, int x, int y){
if (map[6][5] == 2){ //找到终点
return true;
}else {
if (map[x][y] == 0){ //0表示没走过
//执行策略 下 => 右 => 上 => 左
map[x][y] = 2; //假定该点可以走通
if(setWay(map,x+1,y)){ //向下走
return true;
} else if(setWay(map,x,y+1)){ //向右走
return true;
} else if(setWay(map,x-1,y)){ //向上走
return true;
} else if(setWay(map,x,y-1)){ //向左走
return true;
}else {
//说明该点是死点
map[x][y] = 3;
return false;
}
} else {
//如果 map[x][y] !=0 ,可能是 1,2,3 ,直接return false
return false;
}
}
}
}