10、递归的回溯现象与八皇后问题
public class Maze {
public static void main(String[] args) {
//创建地图
int map[][] = new int[8][7];
for(int i = 0; i < 7; ++i) {
map[0][i] = 1;
map[7][i] = 1;
}
for(int j = 0; j < 8; ++j) {
map[j][0] = 1;
map[j][6] = 1;
}
map[3][1] = 1;
map[3][2] = 1;
//输出当前地图
for (int i = 0; i < 8; ++i) {
for (int j = 0; j < 7; ++j) {
System.out.print(map[i][j] + " ");
}
System.out.println();
}
T t1 = new T();
boolean result = t1.findWay(map, 1, 1);
if (result) {
//输出当前地图
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();
}
} else {
System.out.println("未找到路!");
}
}
}
class T {
//使用递归解决老鼠出迷宫
/*
思路
(1)参数为地点,以及迷宫地图
(2)返回值为Boolean类型
(3)退出递归的条件,需要定义map数组各个值的含义
* 0表示没有障碍物
* 1表示有障碍物
* 2表示认为是可以进入的路
* 3表示是路,但是走不通
地形为1,无需探路,若地形为2,3,为判断结果,已经走过,不往回走
0走进去就是2,2的四个方向都走不通就成了3
因为是探路,在遇到目标前是个连续不断的过程,所以遇0则变2,四个方向走不通再变3
因此
* 需要有个判断作为探路结束的标准
* 方法作为判断条件,需要对上一层返回true和false,以确定上一层的语句执行
(4)则当map[6][5] == 2时,表示结束寻路
(5)确定老鼠寻路的策略:下——>右——>上——>左
*/
public boolean findWay(int map[][], int i, int j) {
if(map[6][5] == 2) {
return true;
} else {
if(map[i][j] == 0) {
//该地形为0,无障碍物,则进入,此时该地形便变为了2,即是可以进入的路
map[i][j] = 2;
//进入该地形后,尝试进入他相邻的四个地形
if (findWay(map, i+1, j)) {//向下走,地形为0,进入变2
return true;//必须返回true,如果不返回true,则会在执行完本层后,无法执行上一层if判断
/*
如果此时if语句内得到map[6][5]为true,则会执行此语句
若返回true,意味着下方道路可以走,则会回到上一层if判断,层层返回true,使最终结果为true
若返回false,则会依次执行上一层的条件判断
*/
} else if(findWay(map, i, j+1)) {
return true;
} else if(findWay(map, i-1, j)) {
return true;
} else if(findWay(map, i, j-1)) {
return true;
} else {
map[i][j] = 3;
return false;
}
} else {//此时,该地形为1,无需探路,若地形为2,3,则是只有判断后才可能存在结果,不可能为2,3
return false;
}
}
}
}