思路是先创建一个二维数组map,模拟迷宫地图,数组值1 表示墙 ; 0 表示小球可以走,小球只能从不是墙的地方走,下面是初始地图
代码实现:
- map 表示地图
- i,j 表示从地图的哪个位置开始出发 (1,1)
- 如果小球能到 map[6][5] 位置,则说明通路找到.
- 约定: 当map[i][j] 为 0 表示该点没有走过 当为 1 表示墙 ; 2 表示通路可以走 ; 3 表示死路
- 在走迷宫时,需要确定一个策略(方法) 下->右->上->左 , 如果该点走不通,再回溯
public class MiGong {
public static void main(String[] args) {
// 先创建一个二维数组,模拟迷宫地图
int[][] map = new int[8][7];
// 使用1 表示墙
// 上下全部置为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;
}
//设置挡板, 1 表示
map[3][1] = 1;
map[3][2] = 1;
map[3][4] = 1;
map[3][5] = 1;
map[5][3] = 1;
// 输出地图
System.out.println("地图的情况");
for (int i = 0; i < 8; i++) {
for (int j = 0; j < 7; j++) {
System.out.print(map[i][j] + " ");
}
System.out.println();
}
//使用递归回溯给小球找路
setWay(map, 1, 1);
//输出新的地图, 小球走过,并标识过的递归
System.out.println("小球走过,并标识过的 地图的情况");
for (int i = 0; i < 8; i++) {
for (int j = 0; j < 7; j++) {
System.out.print(map[i][j] + " ");
}
System.out.println();
}
}
//i,j表示小球地图中位置坐标,map表示地图
public static boolean setWay(int[][] map,int i,int j){
if (map[6][5] == 2){
return true;
}else {
if (map[i][j]==0){
//如果当前这个点还没有走过
// 假定该点是可以走通
map[i][j]=2;
//按照策略 下->右->上->左
if(setWay(map, i+1, j)) {//向下走
return true;
} else if (setWay(map, i, j+1)) { //向右走
return true;
} else if (setWay(map, i-1, j)) { //向上
return true;
} else if (setWay(map, i, j-1)){ // 向左走
return true;
} else {
//说明该点是走不通,是死路
map[i][j] = 3;
return false;
}
}else {
// 如果map[i][j] != 0 , 可能是 1, 2, 3 ,代表走不通
return false;
}
}
}
}
运行后输出小球走过后的地图:
死路的情况:
在递归过程中有个要注意,每次递归一次方法都要开辟一个栈帧,一个方法走完才会继续执行上一个未完成的方法。