棧和隊列的迷宮問題

一.無環迷宮

0 0 0 0 0 0
0 1 0 0 0 0
0 1 0 0 0 0
0 1 1 1 1 1
0 1 0 0 0 0
0 1 0 0 0 0

1代表路
0代表不能通過

遞歸方法

思路:

(1) 從起點開始,入口座標作爲參數進入函數,函數中首先要判斷接收的座標是否是出口,如果是出口說明已經到達終點了,打印出堆棧中的座標。
(2) 如果不滿足(1)中條件,依次判斷上下左右的座標是否爲1並且不等於上次走的座標(前提是座標沒有出界),滿足條件的話就壓棧該座標,並作爲下一次函數遞歸的參數。

二.有環迷宮

0 0 0 0 0 0
0 1 1 1 0 0
0 1 0 1 0 0
0 1 1 1 1 1
0 1 0 0 0 0
0 1 0 0 0 0

遞歸方法

思路:

(1) 從起點開始,入口座標作爲參數進入函數,函數中首先要判斷接收的座標是否是出口,如果是出口說明已經到達終點了,並保存此時棧的大小,即起點到中點的距離(有一個最短距離)。
(2) 如果不滿足(1)中條件,依次判斷上下左右的座標是否爲1或者大於函數入口參數的值,並且不等於上次走的座標(前提是座標沒有出界),滿足條件的話就壓棧該座標,並把該座標的值賦爲入函數入口參數座標的值加上一個1,並作爲下一次函數遞歸的參數。

模擬實現這個過程

(1)

0 0 0 0 0 0
0 1 1 1 0 0
0 1 0 1 0 0
0 1 1 1 1 1
0 1 0 0 0 0
0 1 0 0 0 0

(2)

0 0 0 0 0 0
0 1 1 1 0 0
0 1 0 1 0 0
0 1 1 1 1 1
0 2 0 0 0 0
0 1 0 0 0 0

(3)

0 0 0 0 0 0
0 1 1 1 0 0
0 1 0 1 0 0
0 3 1 1 1 1
0 2 0 0 0 0
0 1 0 0 0 0

(4)

0 0 0 0 0 0
0 1 1 1 0 0
0 4 0 1 0 0
0 3 1 1 1 1
0 2 0 0 0 0
0 1 0 0 0 0

(5)

0 0 0 0 0 0
0 5 6 1 0 0
0 4 0 1 0 0
0 3 1 1 1 1
0 2 0 0 0 0
0 1 0 0 0 0

(6)

0 0 0 0 0 0
0 5 6 7 0 0
0 4 0 1 0 0
0 3 1 1 1 1
0 2 0 0 0 0
0 1 0 0 0 0

(7)

0 0 0 0 0 0
0 5 6 7 0 0
0 4 0 8 0 0
0 3 1 1 1 1
0 2 0 0 0 0
0 1 0 0 0 0

(8)

0 0 0 0 0 0
0 5 6 7 0 0
0 4 0 8 0 0
0 3 1 9 1 1
0 2 0 0 0 0
0 1 0 0 0 0

(9)

0 0 0 0 0 0
0 5 6 7 0 0
0 4 0 8 0 0
0 3 1 9 10 1
0 2 0 0 0 0
0 1 0 0 0 0

(10)

0 0 0 0 0 0
0 5 6 7 0 0
0 4 0 8 0 0
0 3 1 9 10 11
0 2 0 0 0 0
0 1 0 0 0 0

現在已經到達終點了,保存此刻棧的大小(即此時起點到終點的距離)

(11)

0 0 0 0 0 0
0 5 6 7 0 0
0 4 0 8 0 0
0 3 1 9 10 11
0 2 0 0 0 0
0 1 0 0 0 0

//無路可走了,開始退棧,回到10

(12)

0 0 0 0 0 0
0 5 6 7 0 0
0 4 0 8 0 0
0 3 1 9 10 11
0 2 0 0 0 0
0 1 0 0 0 0

//依然無路可走了,開始退棧 回到9

發現左邊可以走

(13)

0 0 0 0 0 0
0 5 6 7 0 0
0 4 0 8 0 0
0 3 10 9 10 11
0 2 0 0 0 0
0 1 0 0 0 0

//走向9的左邊

(14)

0 0 0 0 0 0
0 5 6 7 0 0
0 4 0 8 0 0
0 3 10 9 10 11
0 2 0 0 0 0
0 1 0 0 0 0

//現在在10的位置,又無路可走了

(15)

0 0 0 0 0 0
0 5 6 7 0 0
0 4 0 8 0 0
0 3 10 9 10 11
0 2 0 0 0 0
0 1 0 0 0 0

//退棧,回到9

(16)

0 0 0 0 0 0
0 5 6 7 0 0
0 4 0 8 0 0
0 3 10 9 10 11
0 2 0 0 0 0
0 1 0 0 0 0

//回到8

(17)

0 0 0 0 0 0
0 5 6 7 0 0
0 4 0 8 0 0
0 3 10 9 10 11
0 2 0 0 0 0
0 1 0 0 0 0

//回到7

(18)

0 0 0 0 0 0
0 5 6 7 0 0
0 4 0 8 0 0
0 3 10 9 10 11
0 2 0 0 0 0
0 1 0 0 0 0

//回到6

(19)

0 0 0 0 0 0
0 5 6 7 0 0
0 4 0 8 0 0
0 3 10 9 10 11
0 2 0 0 0 0
0 1 0 0 0 0

//回到5

(20)

0 0 0 0 0 0
0 5 6 7 0 0
0 4 0 8 0 0
0 3 10 9 10 11
0 2 0 0 0 0
0 1 0 0 0 0

回到4

(21)

0 0 0 0 0 0
0 5 6 7 0 0
0 4 0 8 0 0
0 3 10 9 10 11
0 2 0 0 0 0
0 1 0 0 0 0

回到3 發現右邊滿足條件,右邊的值大於本身,所以可以走

(22)

0 0 0 0 0 0
0 5 6 7 0 0
0 4 0 8 0 0
0 3 4 9 10 11
0 2 0 0 0 0
0 1 0 0 0 0

發現新的4的右邊滿足條件,右邊的值大於本身,所以可以走

(23)

0 0 0 0 0 0
0 5 6 7 0 0
0 4 0 8 0 0
0 3 4 5 10 11
0 2 0 0 0 0
0 1 0 0 0 0

發現新的5 的右邊滿足條件,右邊的值大於本身,所以可以走然後同理最後變成

(23)

0 0 0 0 0 0
0 5 6 7 0 0
0 4 0 8 0 0
0 3 4 5 6 7
0 2 0 0 0 0
0 1 0 0 0 0

到達終點,用此時棧大小與上一次保存的大小比較

保存最小值作爲最短距離

然後再退棧

最後得到

0 0 0 0 0 0
0 5 6 7 0 0
0 4 0 6 0 0
0 3 4 5 6 7
0 2 0 0 0 0
0 1 0 0 0 0

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章