漢諾塔問題

2022-05-19 19:48:10 字數 1035 閱讀 2212

漢諾塔問題家喻戶曉,它源於乙個印度的神話,內容如下:

在世界中心貝拿勒斯(在印度北部)的聖廟裡,一塊黃銅板上插著三根寶石針。印度教的主神梵天在創造世界的時候,在其中一根針上從下到上地穿好了由大到小的64片金片,這就是所謂的漢諾塔。不論白天黑夜,總有乙個僧侶在按照下面的法則移動這些金片:一次只移動一片,不管在哪根針上,小片必須在大片上面。僧侶們預言,當所有的金片都從梵天穿好的那根針上移到另外一根針上時,世界就將在一聲霹靂中消滅,而梵塔、廟宇和眾生也都將同歸於盡。

這個問題看起來十分可怕,實際上很簡單。接下來就解決乙個問題來體會這個小小問題中的大大的遞迴思想!

有三根柱子,第一根柱子上有n個從下向上越來越小的圓盤。

目標:使第一根柱子上的n個圓盤按原樣擺放在另乙個柱子上。

注:一次移動乙個圓盤,不可以出現大的盤子在小的盤子上面的情況。

解:

首先我們先玩一下這個遊戲。

接著我們找出乙個規律,要徹底地把這個塔移開,我們必須要移開上方的n-1個盤子,使最下面的盤子可以移動到另乙個柱子上,然後在把上方的n-1個盤子移動到最下

面的盤子(也就是最大的盤子)上就可以解決了。而n-1個盤子的移動方法也一樣,因為最下面的**子對上面的n-1個盤子的移動毫無影響。

因此,我們可以得出乙個遞推式:

\[f_n=2f_+1

\]\(f_n\)代表第乙個柱子上有n個盤子的情況,所以這個問題得到了解決

**如下:時間複雜度\(o(2^n )\)

#include using namespace std;

int main()

-1\)

證畢。所以這才是這種漢諾塔問題的最優解!

最終**如下:時間複雜度o(⁡\(log_2n\) )

#include using namespace std;

int qp(int a,int b)

int main()

漢諾塔問題

問題 假設有3個分別命名為x,y,z的寶塔,在塔座x上插有n個直徑大小各不相同,從小到大編號為1,2,3。n的圓盤。現要求將x軸上的n個圓盤移至塔座z上 並仍然按同樣的順序疊排,圓盤移動時必須遵循下列規則 1.每次只能移動乙個圓盤 2.圓盤可以插在x,y和z中的任一塔座上 3.任何時刻都不能將乙個較...

漢諾塔問題

問題是 印度的乙個古老的傳說。開天闢地的神勃拉瑪在乙個廟裡留下了三根金剛石的棒,第一根上面套著64個圓的金片,最大的乙個在底下,其餘乙個比乙個小,依次疊上去,廟裡的眾僧不倦地把它們乙個個地從這根棒搬到另一根棒上,規定可利用中間的一根棒作為幫助,但每次只能搬乙個,而且大的不能放在小的上面。解答結果請自...

漢諾塔問題

漢諾塔如下圖所示 需要我們完成的事情是把盤子移動到c,規則就不贅述了。演算法思想 總體來說是利用遞迴完成的。假設 1 a上只有乙個盤子,我們直接移動到c即可 2 a上有兩個盤子,我們把第二個盤子上面的所有盤子 此時只有乙個,比較容易 移動到b,再把第二個盤子移動到目的地c,最後把b上的盤子移動到c ...