java实现迷宫回溯问题
java实现迷宫回溯问题
代码实现
public class Demo {
public static void main(String[] args) {
// 创建一个二维数组,模拟迷宫
int[][] map = new int[8][7];
// 使用1表示墙
// 上下
for (int i = 0; i < map[0].length; i++) {
map[0][i] = 1;
map[(map.length - 1)][i] = 1;
}
// 左右
for (int i = 0; i < map.length; ++i) {
map[i][0] = 1;
map[i][(map[0].length - 1)] = 1;
}
// 挡板
map[3][1] = 1;
map[3][2] = 1;
System.out.println("原来的地图");
for (int[] ints : map) {
for (int i : ints) {
System.out.print(i + "\t");
}
System.out.println();
}
// setWay(map, 1, 1);
NewSetWay(map, 1, 1);
System.out.println("找过路之后的地图");
for (int[] ints : map) {
for (int i : ints) {
System.out.print(i + "\t");
}
System.out.println();
}
}
/**
* 题目:
* 从[1,1]找到[6,5]
* <p>
* 思路:
* 约定:
* 当map[i][j]
* 为0时说明该点没走过
* 为1时说明走不通
* 为2时说明通路可以走
* 为3时说明已经走过,但是不通
* <p>
* 策略:
* 1. 走法:下->右->上->左,走不通再回溯
*
* @param map 表示地图
* @param i 从哪个位置找
* @param j
* @return 找到通路,返回true,否则false
*/
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 {
// 如果是1,是墙
// 如果是2,是走过了
// 如果是3,走不通
return false;
}
}
}
// 修改找路的策略,上,右,下,左
public static boolean NewSetWay(int[][] map, int i, int j) {
// 找到
if (map[6][5] == 2) {
return true;
} else {
// 如果没找到
// 按策略找
if (map[i][j] == 0) {
map[i][j] = 2;
if (NewSetWay(map, i - 1, j)) {
return true;
} else if (NewSetWay(map, i, j + 1)) {
return true;
} else if (NewSetWay(map, i + 1, j)) {
return true;
} else if (NewSetWay(map, i, j - 1)) {
return true;
} else {
map[i][j] = 3;
return false;
}
} else {
return false;
}
}
}
}