方法遞迴的經典案例 簡易迷宮問題

2021-10-13 07:41:49 字數 2149 閱讀 8752

問題引入( 如圖簡易迷宮,小球從arr進入,到arr出來)

如圖,起點在arr終點是arr

我們從起點出發,到達終點,列印走過的路徑222。

★如圖,0表示我們路線沒有走過的路(小球只能走0,因為2和3都被走過),2表示正確路徑,3表示死路。

我們要想解決這個問題就要引入我們所說的方法遞迴,這是我們解決迷宮問題。

我們平日裡走迷宮,也只有一種辦法,去試!計算機也是如此,因此我們要設計乙個方法,讓**不斷去嘗試每條路徑,我們不妨這樣設計—分4步,先讓小球往下走,走不通就往右走,再不行往上走,再不行往左走。每一步都這樣,我們將稱其為一套操作,每乙個0點我們都要進行這樣一套操作。這樣如果對於如下圖(直來直去的迷宮)所示的迷宮是很好理解的。

但是,我們的迷宮通常都是有好幾條死胡同的,我們設想,如果只有上面的方法,我們如果遇到了一條這樣的

胡同

那麼我們僅僅按照上面的走法,

當我們到達綠色框的時候,就需要往右走,發現不行,那就往上,可以,我們在對綠色框上面的位置進行一套操作,小球會先往下走。到這就不對勁了,那不是小球一直在這兩個之間運動了嗎!

沒錯,這個時候,我們就來講一下解決問題的第二個關鍵,回溯思想,我們自己在走迷宮的時候,我們知道,如果這是一條死胡同,那麼我們就要回到進入死胡同的地方,選擇另一條路,計算機也是如此,我們就要想辦法回到死胡同入口處

讓計算機知道,向下走是走不通的,要在紫色框中向右走。這需要乙個回溯思想,我們其實每走一步,就是呼叫了一次方法,再在方法中呼叫方法,層層疊加,小球必須走0,但是到達綠色框7的時候,發現四周除了牆就是走過的路(我們成這個點為死點,將其標記為3),那就回它的方法呼叫之處,也就是框6

計畫的是回到框6之後,發現情況跟在7的時候一樣,四周除了2就是牆,那就再回到呼叫出框5,一直這樣下去,最後回到框2,執行第二步向右走,成功解決死胡同問題?。這是我們的回溯思想。

既然2和3,小球都不會再次走,為什麼要將死路標記為3呢?不標記最後不是也可以到達終點,當然可以,但是我們走迷宮最終要顯示的是一條正確的路徑,沒有3,顯示的是所有嘗試走的路徑。

下面是此類迷宮問題的**實現

package 遞迴經典問題.迷宮;

public

class

migong,,

,,,,

,};migong

(arr,0,

0);for

(int i =

0; i < arr.length; i++

) system.out.

println

(" ");

}}//起點(0,0)

//終點(6,6)

//下右上左

public

static

boolean

migong

(int

map,

int i,

int j)

else

elseif(

migong

(map,i,j+1)

)elseif(

migong

(map,i-

1,j)

)elseif(

migong

(map,i,j-1)

)else

}else}}

}

漢諾塔問題(遞迴方法的經典案例)

漢諾塔 又稱河內塔 問題是源於印度乙個古老傳說的益智玩具。大梵天創造世界的時候做了三根金剛石柱子,在一根柱子上從下往上按照大小順序摞著64片 圓盤。大梵天命令婆羅門把圓盤從下面開始按大小順序重新擺放在另一根柱子上。並且規定,在小圓盤上不能放大圓盤,在三根柱子之間一次只能移動乙個圓盤。漢諾塔問題是遞迴...

C實現遞迴的經典案例

分析 無論中間怎麼跳,第n個台階是必須要碰到的,他可以從第n 1個跳一步來,也可以是第n 2個跳兩步過來,兩種情況分別代表著不同的跳法,即第n個台階的跳法 jumpnumber n jumpnumber n 1 jumpnumber n 2 以此類推,跳到jumpnumber n 1 的也是由n 2...

迷宮問題(遞迴的應用)

package recursion public class migong 左右全部置為1 for int i 0 i 8 i 設定擋板,1 表示 map 3 1 1 map 3 2 1 輸出地圖 for int i 0 i 8 i system.out.println 使用遞迴回溯給小球找路 輸出...