如图所示,用代码实现从(1,1)白色方格移动到(6,5)白色方格(代码的运行结果需要有具体的路线),红色方格代表围墙
完整代码如下:
package com.wqc.recursion;
/**
* @author 高瞻远瞩
* @version 1.0
* @motto 算法并不可怕, 可怕的是你不敢面对它, 加油!别浮躁~冲击大厂!!!
* 用递归解决迷宫问题 规则是在一个8*7大小的迷宫当中 从2行2列成功走到7行6列 即为胜利 最后需要知道走的是哪条路线
* 四周的每一行是围墙
*/
public class MiGong {
static int i;
public static void main(String[] args) {
//先初始化一个8*7的二维数组
int[][] map = new int[8][7];//初始里面的元素全为0
//设置围墙 值为1
for (int i = 0; i < 7; i++) {//第一行和第8行
map[0][i] = 1;
map[7][i] = 1;
// map[2][i] = 1;
}
for (int i = 1; i < 7; i++) {//第一列和第7列
map[i][0] = 1;
map[i][6] = 1;
}
map[3][1] = 1;
map[3][2] = 1;
//在这里将调用一个方法 进行递归走出迷宫
escapeMap(map,1,1);//递归如果传入的是一个引用类型 则每一个递归开的栈空间共享这一个引用类型
System.out.println("走的步数=" + i);
for (int[] ints : map) {
for (int i : ints) {
System.out.print(i + "\t");
}
System.out.println();
}
}
/**
* @param map 传入的地图
* @param row 目前小老鼠所在迷宫的行
* @param col 列
* @return 如果找到通路就返回true 没有就返回false
* 规定2代表小老鼠走过的路径 每走一步就把当前格子置为2 0代表可以往前走 1代表不能走 把走了但没走通设为3
*/
public static boolean escapeMap(int[][] map, int row, int col) {
//先考虑递归结束的条件
if (map[6][5] == 2) {//结束条件
return true;
} else {
if (map[row][col] == 0) {//如果等于0 说明可以走 其他条件均为不能走的情况
map[row][col] = 2;//把当前的格子置为已走过 然后分别向右 下 上 左 进行递归一步
i++;
if (escapeMap(map, row, col + 1)) {
return true;
} else if (escapeMap(map, row + 1, col)) {
return true;
} else if (escapeMap(map, row - 1, col)) {
return true;
} else if (escapeMap(map, row, col - 1)) {
return true;
} else { //加入上面的逻辑都试过了 都返回的false 说明此路不通 把路径都设为3
map[row][col] = 3;
return false;//这种情况是走了 但是没有走通
}
}
//如果以上逻辑的判断条件为假 才会走以下这个逻辑 情况如下
// 3的话走了但没走通 1的话代表都是墙 没有可以走的路 2的话 路是已经走过了
return false;
}
}
}