6.6 递归-迷宫问题
递归的相关知识请查看上篇文章,点击连接前往【Java数据结构和算法–递归】,在这里就直接上完整代码了。
6.6.1 代码实现
/**
* @author zk
* @version 1.0.0
* @ClassName MiGong.java
* @Description TODO 递归解决迷宫问题
* @createTime 2021年09月23日 10:05:00
*/
public class MiGong {
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 i = 1; i <= 6; i++) {
map[i][0] = 1;
map[i][6] = 1;
}
map[3][1] = 1;
map[3][2] = 1;
map[2][2] = 1;
// ↑上面是制作地图
// 显示地图
for (int[] row : map) {
for (int col : row) {
System.out.print(col + "\t");
}
System.out.println();
}
System.out.println("-------------------------");
// 走迷宫
setWay(map,1,1);
// 显示路线
for (int[] row : map) {
for (int col : row) {
System.out.print(col + "\t");
}
System.out.println();
}
}
//使用递归回溯来给小球找路
//说明
//1. map 表示地图
//2. i,j 表示从地图的哪个位置开始出发 (1,1)
//3. 如果小球能到 map[6][5] 位置,则说明通路找到.
//4. 约定: 当 map[i][j] 为 0 表示该点没有走过 当为 1 表示墙 2 表示通路可以走 ; 3 表示该点已经走过,但是走不通
//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)){ //往下走
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 {
// 该点不是0 就是 1 或 2 或3 均不可在走 所以直接返回false
return false;
}
}
}
// 如果想要求最短路径,改变下->右->上->左这个策略,把所有策略都走一遍,看看哪个路线最短
}