一、迷宮的定義
//先創建一個二維數組,模擬迷宮
int[][] map = new int[8][7];
//使用1表示牆
//上下全部置爲1
for (int i = 0; i < 7; i++) {
map[0][i] = 1;
map[7][i] = 1;
}
//左右全部置爲1
for (int i = 0; i < 8; i++) {
map[i][0] = 1;
map[i][6] = 1;
}
//設置擋板,1表示
map[3][1] = 1;
map[3][2] = 1;
二、核心代碼
思路:
- map:地圖;
- i,j:表示從地圖的哪個位置開始出發(1,1);
- 如果小球能到map[6][5],則說明通路找到;
- 約定:當map[i][j]爲0表示該點沒有走過,爲1表示牆,2表示可以走,3表示該點已經走過,但是走不通;
- 走迷宮時,要確定一個方法:下->右->上->左,如果該點走不通,再回調。
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 + 1,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 {
//如果map[i][j] != 0,可能是1,2,3
return false;
}
}
}
三、測試
//使用遞歸回溯給小球找路
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();
}