1. 題目描述
給定一個m*n的迷宮,隨機給出障礙物,使得小球從起點可以走到出口
2. 迷宮設計
這個視自己喜好設定,障礙物也隨便設點,使用二維數組模擬迷宮,1即爲牆壁與障礙物
3. 思路分析
使用遞歸來模擬小球運動,假設小球從(1,1)開始,到(n-1,m-1)即爲找到出口。
我們規定 2 爲可以找到下一條路線的點,3 爲四處無法行走的點,未走過的點爲0.
行進方向自行規定,此處我使用順時針,即上右下左。
當出口處爲2,即出口處被標記爲可行時,返回true,即可行。
當小球運動到沒有未走過的點時,判斷其上行是否可行,若上行可行,則進入遞歸,將座標上移一位並且繼續進行判定。右下左方向同上行。
如果不是0,則說明該路徑不可行,返回false。
4. 代碼
package com.nansl.stucts.recurrence;
public class Migong {
public static void main(String[] args) {
//聲明地圖 此處將迷宮大小寫死,感興趣的朋友可以改變迷宮大小
int[][] map = new int[15][15];
for (int i = 0; i < 15; i++){
map[i][0] = 1;
map[i][14] = 1;
}
for (int i = 0; i < 15; i++){
map[0][i] = 1;
map[14][i] = 1;
}
map[3][3] = 1;
map[6][8] = 1;
map[2][2] = 1;
map[3][2] = 1;
map[1][2] = 1;
map[2][3] = 1;
for (int i = 0; i < 15; i++){
for (int j = 0; j < 15; j++){
System.out.print(map[i][j]+" ");
}
System.out.println();
}
move(map, 1, 1);
System.out.println("---------------------------");
for (int i = 0; i < 15; i++){
for (int j = 0; j < 15; j++){
System.out.print(map[i][j]+" ");
}
System.out.println();
}
}
/**
* 定義行走規則:上右下左
* 走過的可以走的路爲 2 無路可走的地方爲3
* 當進行遞歸模仿移動時,前進的道路如果爲 1 2 3 則返回false 即不可以通行
* @param map 地圖
* @param i 橫座標
* @param j 縱座標
* @return 當前道路是否能走
*/
private static boolean move(int[][] map , int i , int j){
//出口在6 5
if (map[6][5] == 2){
return true;
} else{//如果沒有找到出口
//首先要判斷這個點是否爲沒有走過得點
if (map[i][j] == 0){
//先將目前走到的位置設置爲可行
//如果上下左右走遍了都返回false 就會返回到本層遞歸中 則設置當前點爲不可行3
map[i][j] = 2;
//先向上走
if (move(map, i-1, j)){//如果向上移動返回爲true 則返回true 向上移動則會繼續遞歸調用下一層move() 相當於走了下一步 就這樣如果有路會一直往前走
return true;
}else if (move(map, i, j+1)){//向右移動
return true;
}else if (move(map, i+1, j)){//向下移動
return true;
}else if (move(map, i, j-1)){
return true;
}else {//向上下左右走都返回false 那麼代表這個點不通,回到上一個點
map[i][j] = 3;
return false;
}
}else { //如果不爲0 那麼爲 1 2 3 都是不可以走的
return false;
}
}
}
}