1、创建一个迷宫
代码约定:
0:表示未走过的区域
1:表示墙壁
2:表示走过且为通路的区域
3:表示走过且路不通的区域
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 < 8; i++) {
map[i][0] = 1;
map[i][6] = 1;
}
// 设置挡板
map[4][1] = 1;
map[4][2] = 1;
map[4][3] = 1;
// 输出地图
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();
}
}
2、走路方法
此处采用了递归的方法:
行走的策略为:下-->右-->上-->左 即一种方式走不通则换另一种方式,如果都走不通则回溯,在刚走过的区域标明为3。
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 {
// 走不通置为3
map[i][j] = 3;
return false;
}
/**
* 使用递归回溯给小球找路 1、map表示地图 2、i,j表示地图从[i][j]位置开始出发 3、如果小球能到达[6][5]则说明找到通路 4、策略
* 下->右->上->左
*
* @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 {
// 走不通置为3
map[i][j] = 3;
return false;
}
} else { // 除了0之外,起点可能是0,2,3
return false;
}
}
3、测试效果
5、整体代码
package recursion;
public class Labyrinth {
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 < 8; i++) {
map[i][0] = 1;
map[i][6] = 1;
}
// 设置挡板
map[4][1] = 1;
map[4][2] = 1;
map[4][3] = 1;
// 输出地图
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();
}
// 使用递归让小球回溯
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] + " ");
}
System.out.println();
}
}
/**
* 使用递归回溯给小球找路 1、map表示地图 2、i,j表示地图从[i][j]位置开始出发 3、如果小球能到达[6][5]则说明找到通路 4、策略
* 下->右->上->左
*
* @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 {
// 走不通置为3
map[i][j] = 3;
return false;
}
} else { // 除了0之外,起点可能是0,2,3
return false;
}
}
}
}