迷宮回溯問題

2022-08-26 07:18:11 字數 2093 閱讀 1358

概念介紹

請看圖,上圖為乙個迷宮,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 定義咱們的方法

1

/**2

* @param

map 表示地圖3*

@param

i,j 表示起始位置4*

@return

如果能接著往下走,就返回true, 否則返回false5*/

6public

static

boolean walk(int map, int i, int

j)

2.2 當我們即將踏足點a,需要做兩件事,一件事是a點我們沒有走過,另一件是我們踏足後,標記該點為已經走過

1

/**2

* @param

map 表示地圖3*

@param

i,j 表示起始位置4*

@return

如果能接著往下走,就返回true, 否則返回false5*/

6public

static

boolean walk(int map, int i, int

j)33 }

2.3 執行我們行走策略,執行策略可以有很多種,比如右→下→左→上或者下→右→上→左等,這裡我們使用下→右→上→左

1

//執行我們走迷宮的策略:下→右→上→左

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

2.4設定行走結束條件,走到b點:map[6][5] == 2

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表示可以走的路,只能橫著走或豎著走,不能斜著走,要求程式設計序找出從左上角...