概念介紹
請看圖,上圖為乙個迷宮,1為阻擋區間,也就是說不能走。0為可踏足地帶,我們的目標是從a點出發,走到b點,則任務完成!
為了方便大家理解,我們只在(3,1)以及(3,2)這兩個位置設定阻擋位。
**實現
先明確實現思路:假設我們在a(1,1)位置,我們能做的操作是嘗試向下、向右、向上或者向左走一步。假設我們向下走一步成功後,到達(2,1)的位置,我們能做的操作就是重複在a點的操作。既然每一步的操作相同,只不過結果可能不同,那麼這時候我們可以使用遞迴的思想!當我們用到遞迴時,一定要注意,退出遞迴的條件,那就是b(6,5)被標記為已經走過,在這裡,我們約定,走過的點會被標記為2。不囉嗦,開始寫**。
第一步:構造圖上的迷宮。
1第二步:實現行走迷宮的方法。public
static
int buildmap()
9for (int i = 0; i < 8; i++)
13//
設定擋板
14 map[3][1] = 1;
15 map[3][2] = 1;
16return
map;
17 }
在這裡,我們規定:1表示牆,2表示走過路,3表示該點為死胡同,已經踏足,但是走不通了。
我們設定的地圖很簡單,所以不會出現死胡同的情況,大家可以設計迷宮複雜一些,就會出現死胡同的情況。
2.1 定義咱們的方法
12.2 當我們即將踏足點a,需要做兩件事,一件事是a點我們沒有走過,另一件是我們踏足後,標記該點為已經走過/**2
* @param
map 表示地圖3*
@param
i,j 表示起始位置4*
@return
如果能接著往下走,就返回true, 否則返回false5*/
6public
static
boolean walk(int map, int i, int
j)
12.3 執行我們行走策略,執行策略可以有很多種,比如右→下→左→上或者下→右→上→左等,這裡我們使用下→右→上→左/**2
* @param
map 表示地圖3*
@param
i,j 表示起始位置4*
@return
如果能接著往下走,就返回true, 否則返回false5*/
6public
static
boolean walk(int map, int i, int
j)33 }
12.4設定行走結束條件,走到b點:map[6][5] == 2//執行我們走迷宮的策略:下→右→上→左
2if(walk(map, i+1, j)) else
if (walk(map, i, j+1)) else
if (walk(map, i-1, j)) else
if (walk(map, i, j-1)) else
1/**2
* @param
map 表示地圖3*
@param
i,j 表示起始位置4*
@return
如果能接著往下走,就返回true, 否則返回false5*/
6public
static
boolean walk(int map, int i, int
j) else
else
if (walk(map, i, j+1)) else
if (walk(map, i-1, j)) else
if (walk(map, i, j-1)) else
29 } else32}
33 }
回溯法 迷宮問題
1.首先我們需要自定義乙個迷宮 左上角為入口,右下角為出口,0為路,1為牆 用二維陣列儲存 2.我們在走迷宮之前,首先要確立乙個走的順序,即貪心準則,我們首先試探的方向應該是下,然後是右,上,左 為了確保每乙個格仔都有上下左右,我們需要給我們的迷宮加上一圈牆8 8,變成10 10 3.當我們在乙個格...
迷宮問題 回溯法
描述 給乙個20 20的迷宮 起點座標和終點座標,問從起點是否能到達終點。輸入 多個測例。輸入的第一行是乙個整數n,表示測例的個數。接下來是n個測例,每個測例佔21行,第一行四個整數x1,y1,x2,y2是起止點的位置 座標從零開始 x1,y1 是起點,x2,y2 是終點。下面20行每行20個字元,...
迷宮問題(BFS回溯)
迷宮問題 題目鏈結 time limit 1000msmemory limit 65536kb64bit io format i64d i64u 定義乙個二維陣列 int maze 5 5 它表示乙個迷宮,其中的1表示牆壁,0表示可以走的路,只能橫著走或豎著走,不能斜著走,要求程式設計序找出從左上角...