- 思路:
1、先用二维数组模仿迷宫,并用数字代表墙,0:表示未走过;1:代表墙,表示不能走;2:表示走过,能走;3:表示走过,走不通
2、指定走出迷宫策略:按照下、右、上、左的顺序走迷宫
- 代码实现:
package resursion;
import java.util.ArrayList;
public class Migong {
public static void main(String[] args) {
// TODO Auto-generated method stub
//递归回溯应用:迷宫问题
/*
* 思路:
* 1、先用二维数组模仿迷宫,并用数字代表墙,0:表示未走过;1:代表墙,表示不能走;2:表示走过,能走;3:表示走过,走不通
* 2、指定走出迷宫策略:按照下、右、上、左的顺序走迷宫
*/
int[][] map = new int[8][7];
buildMap(map,8,7);
migong(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();
}
}
/**
* 构建地图
* @param map
*/
public static void buildMap(int[][] map,int x,int y) {
//先把全部值置为0
for (int i = 0; i < x; i++) {
for (int j = 0; j < y; j++) {
map[x-1][y-1] = 0;
}
}
//开始构建墙 :最上一行和最下一行
for(int j = 0 ; j < y; j++ ) {
map[0][j] = 1;
map[x-1][j] = 1;
}
//开始构建墙 :最左一列和最右一列
for(int i = 0 ; i < x; i++ ) {
map[i][0] = 1;
map[i][y-1] = 1;
}
//开始构建墙 :横插一道
map[x/2][0] = 1;
map[x/2][1] = 1;
map[x/2][2] = 1;
//打印数据
System.out.println("地图构建好:");
for (int i = 0; i < x; i++) {
for (int j = 0; j < y; j++) {
System.out.print(map[i][j]);
}
System.out.println();
}
}
/**
* 递归回溯应用:迷宫问题
* 思路:
* 1、先用二维数组模仿迷宫,并用数字代表墙,0:表示未走过;1:代表墙,表示不能走;2:表示通路,能走;3:表示走过,走不通
* 2、指定走出迷宫策略:按照下、右、上、左的顺序走迷宫
* @param map 迷宫当前的道路
* @param x 起点
* @param y
* @return true:表示能走通,false :表示走不通
*/
public static boolean migong(int[][] map,int x,int y) {
if(map[6][5] == 2) {
return true;
}else if(map[x][y] == 0) {//未走过
map[x][y] = 2;//假设该点可以走通
if(migong(map,x+1,y)) {//下
return true;
}
if(migong(map,x,y+1)) {//右
return true;
}
if(migong(map,x-1,y)) {//上
return true;
}
if(migong(map,x,y-1)) {//左
return true;
}
map[x][y] = 3;
return false;
}else {
return false;
}
}
}
注:可以通过更换策略,进行线路比较