一.無環迷宮
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