遞迴 漢諾塔問題

2021-10-18 22:35:53 字數 1233 閱讀 1123

具體題目不再贅述,主要是:

a(起始),b(輔助),c(目的)三個柱子,n個圓盤。限制條件:且一次只移動乙個圓盤,在小圓盤上不能放大圓盤。

其實漢諾塔問題最最重要的地方在於理解三個柱子的角色是時刻在變換的,即什麼是否是「目的」,什麼時候是「輔助」等等。

當n=1時,直接把a中的圓盤移過去c即可;

當n=2時,a上面的第乙個圓盤(n-1)移到b,把最大(底)的移到c,再把b的乙個圓盤移到c即可;

當n=3時,①a上面的n-1個圓盤(2個)先移到b;

②再把a最底的移到c;

③再把b的n-1個圓盤移到c即可;

在①中,a是起始,b是輔助,c是目標,而在①過程中把a上面n-1個圓盤看成另乙個整體時,要移到b,此時又可以看成a是起始,c是輔助,b是目標!

相同的,在③中,把b的n-1個看成整體,則b是起始,a是輔助,c是目標。

#include#includeusing namespace std;

int i; //記錄步數

void move(int n,char from,char to)//n為盤子編號

void hanio(int n,char from,char assit,char to)//n表示要將多少個"圓盤"從起始柱子移動至目標柱子

}int main()

}

與問題一的唯一區別在於,不能直接從第一根桿子移動到第三根桿子上。

那麼我們可以得出:

假設從第一根桿上移動n個圓盤到第三根桿子上需要 f[n] 次移動,那麼 f[n] 的組成方式如下:

先移動 n-1 個圓盤到第三根桿上需 f[n-1] 次移動,然後將最大圓盤移動到中間桿上需要 1 次移動,再將 n-1 個圓盤移回第一根桿上同意需要 f[n-1] 次移動,移動最大的盤子到第三根桿子上需要 1 次移動,最後將 n-1 個圓盤移動到第三根桿上需要 f[n-1] 次移動,於是便有了f[n]=3f[n-1]+2

遞迴結束條件:當 n=1 時,顯然需要移動2次(第一根移動到第二根然後移動第三根);

#include#includeusing namespace std;

long long function(int n)

int main()

{ int n;

while(cin>>n)

{cout<

漢諾塔問題(遞迴)

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

漢諾塔問題(遞迴)

問題 漢諾塔問題 解法 遞迴求解 思路 先把n 1從a移動b 在把第n個從a移到c 使用遞迴使得 變得簡單 複雜度 2的n次方 1 includeint step 1 void hanoi int level,char a,char b,char c 1 當盤子數大於1時,先把n 1個從a借助c移動...

漢諾塔問題(遞迴)

漢諾塔 在印度,有這麼乙個古老的傳說 在世界中心貝拿勒斯 在印度北部 的聖廟裡,有三根柱子。印度教的主神梵天在創造世界的時候,在其中一根柱子上從下到上地穿好了由大到小的64片金盤,這就是所謂的漢諾塔。不論白天黑夜,總有乙個僧侶在按照下面的法則移動這些金盤 一次只移動一片,不管在哪根柱子上,小片必須在...