漢諾塔遊戲

2021-09-26 19:22:21 字數 1113 閱讀 6138

漢諾塔**於印度傳說的乙個故事,上帝創造世界時作了三根金剛石柱子,在一根柱子上從下往上按大小順序摞著64片**圓盤。上帝命令婆羅門把圓盤從下面開始按大小順序重新擺放在另一根柱子上。並且規定,在小圓盤上不能放大圓盤,在三根柱子之間一回只能移動乙個圓盤。

要想玩轉漢諾塔,需要先理解遞迴

如果乙個問題可以不斷地分解為型別相同,規模更小的子問題,並且有明確的最小規模邊界,,那麼這個問題就可以用遞迴來解決:

要想解決這個問題,就必須先解決它的子問題,要想解決它的子問題,就必須先解決它的子問題的子問題...這就是遞迴的「遞」;

當子問題減小到一定規模,可以根據明確的已知條件,將此時的子問題直接解決,這就是遞迴邊界。然後拿著計算結果返回解決它的父問題,繼而解決它父問題的父問題...最終整個問題得以解決,這就是遞迴的「歸」。

漢諾塔就是典型的遞迴問題。

理解了遞迴,再來看一下解決漢諾塔問題的思路:

我們將第1根柱子上的前n-1個盤子看作乙個整體,將它移動到第2根柱子上;

然後將第1根柱子上的第n個盤子移動到第3根柱子上;

再然後將第2根柱子上的前所有盤子,也就是前n-1個盤子,作為乙個整體,移動到第3根柱子上,完成漢諾塔遊戲。

這樣,問題的規模是不是就縮小了?要完成漢諾塔遊戲,我們只需要知道前n-1個盤子是怎樣從第1根柱子移動到第2根柱子上就可以了。

同理我們再將前n-2個盤子看作乙個整體,將它從第1根柱子移動到第2根柱子上;

然後將第n-1個盤子移動到第3根柱子上;

再然後將第2根柱子上的所有盤子,也就是前n-2個盤子,作為乙個整體,移動到第3根柱子上;

最後將在第3根柱子上的所有盤子,也就是前n-1個盤子,作為乙個整體,移動到第2根柱子上,至此,第1柱子上的前n-1個盤子移動到了第2根柱子上。

可以看出,要想知道前n-1個盤子如何從第1根柱子移動到第2根柱子上,只需要知道前n-2個盤子是如何從第1根柱子移動到第2根柱子上就可以了,問題規模進一步縮小。

當問題規模縮小到只剩下1個盤子的時候,問題變得非常簡單,即直接將它從第1根柱子移動到第2根柱子上,然後就是回歸的過程。

void hanno(int n, char a, char b, char c) 

}

漢諾塔遊戲

題目描述 在a b c三根柱子上,有n個不同大小的圓盤 設半徑分別為1 n 一開始他們都疊在a上,你的目標是在最少的合法移動步數內將所有盤子從a塔移動到c塔。遊戲中的每一步規則如下 1 每一步只允許移動乙個盤子 從一根柱子最上方到另乙個柱子的最上方 2 移動的過程中,你必須保證大的盤子不能在小的盤子...

python 漢諾塔 Python漢諾塔

import turtle class stack def init self self.items def isempty self return len self.items 0 def push self,item def pop self return self.items.pop def ...

列印漢諾塔遊戲軌跡

對於傳統的漢諾塔遊戲我們做乙個拓展,我們有從大到小放置的n個圓盤,開始時所有圓盤都放在左邊的柱子上,按照漢諾塔遊戲的要求我們要把所有的圓盤都移到右邊的柱子上,請實現乙個函式列印最優移動軌跡。給定乙個intn,表示有n個圓盤。請返回乙個string陣列,其中的元素依次為每次移動的描述。描述格式為 mo...