java通过递归实现迷宫问题,
public class Maze {
public static void main(String[] args) {
// 创建一个8行7列的迷宫矩阵
int[][] mate = new int[8][7];
// 给上下面加墙
for (int i = 0; i < 7; i++) {
mate[0][i] = 1;
mate[7][i] = 1;
}
// 迷宫中加障碍
mate[2][1] = 1;
mate[2][2] = 1;
// 给左右面加墙
for (int i = 0; i < 8; i++) {
mate[i][0] = 1;
mate[i][6] = 1;
}
// 迷宫出口 mate[6][5]
mate[7][6] = 4;
// 遍历迷宫
System.out.println("#### 迷宫图遍历如下 ####");
for (int i = 0; i < 8; i++) {
for (int j = 0; j < 7; j++) {
System.out.print(mate[i][j] + " ");
}
System.out.println();
}
// 从(1,1)的位置开始出发
setWay(mate,1,1);
System.out.println("---> 走迷宫图遍历如下 <---");
for (int i = 0; i < 8; i++) {
for (int j = 0; j < 7; j++) {
System.out.print(mate[i][j] + " ");
}
System.out.println();
}
}
/**
* 方法:递归实现迷宫问题
* 1.如果小球能到达mate[6][5]的位置,则说明走出迷宫
* 2.约定:当mate[i][j]为 0 时表示该点没有走过,为 1 表示墙,为 2 表示走过,为 3 表示该点已经走过,但是走不通
* 3.走在迷宫时,需要确定一个策略:下->下右->右->右上->上->上左->左->左下,如果走不通,则再回溯.
* @param mate 表示矩阵
* @param i 横轴坐标
* @param j 纵轴坐标
* @return 走得通则返回true,不通则返回false
*/
public static boolean setWay(int[][] mate, int i, int j) {
if (mate[6][5] == 2) { // 到该位置,说明已经找到出口,返回true
return true;
}else {
// 判断当前路径是否可走
if (mate[i][j] == 0) { // 如果还没走过,则向前走,且做标记
mate[i][j] = 2;
// 按照策略:下->下右->右->右上->上->上左->左->左下
if (setWay(mate, i+1,j)) { // 下
return true;
}else if(setWay(mate,i+1,j+1)) { // 下右
return true;
}else if(setWay(mate,i,j+1)) { // 右
return true;
}else if(setWay(mate,i-1,j+1)) { // 右上
return true;
}else if(setWay(mate,i-1,j)) { // 上
return true;
}else if(setWay(mate,i-1,j-1)) { // 上左
return true;
}else if(setWay(mate,i,j-1)) { // 左
return true;
}else if(setWay(mate,i+1,j-1)) { // 左下
return true;
}else { // 表示 上下左右都走不通,该点为死胡同
mate[i][j] = 3;
return false;
}
}else { // 表示 可能为 1->墙,2->走过,3->走不通,的情况
return false;
}
}
}
}