6.6迷宫问题
package com.atguigu05.recursion;
/**
* @author peng
* @date 2021/11/18 - 11:14
*
* 使用递归解决迷宫问题
*/
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 < 7; i++) {
map[i][0] = 1;//将第一列设置为墙
map[i][6] = 1;//将最后一列设置为墙
}
//设置围墙之内的障碍物
map[3][1] = 1;
map[3][2] = 1;
//输出地图
System.out.println("当前的地图情况:");
for (int i = 0; i < 8; i++) {
for (int j = 0; j < 7; j++) {
System.out.print(map[i][j] + "\t");
}
System.out.println();//每输出一行就换行
}
//假设小球从起点【1】【1】出发
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] + "\t");
}
System.out.println();//每输出一行就换行
}
}
/**
* 使用递归来给小球找到走出迷宫的路
* 1、map表示地图
* 2、i、j表示小球起点的坐标
* 3、数字1表示墙,数字0表示小球没有走过的路,数字2表示小球走的路,数字3表示小球曾经走过但是没有走通的路
* 4、小球的行进策略是下、右、上、左
* 5、小球如果能走到坐标为【6】【5】的点,表示小球走出迷宫了
*/
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)){
//如果当前这个点的下方是可行的,就返回true
return true;
}else if(setWay(map, i, j + 1)) {
//如果下方不可行就判断右方,可行就返回true
return true;
}else if (setWay(map, i - 1, j)) {
//如果右方还是不可行,就继续判断上方,可行就返回true
return true;
}else if (setWay(map, i, j - 1)){
//如果上方还是不可行,就继续判断左方, 可行就返回true
return true;
}else {
//如果下右上左都不可行,那么直接放回false,并将当前的点置为3
map[i][j] = 3;
return false;
}
}else {
//如果当前的这个点不是0,那么表示这条路是走不通的
return false;
}
}
}
}