奇怪的漢諾塔 演算法高階指南

2021-09-11 06:05:39 字數 725 閱讀 7080

在我們平常的時候做題,一般見到的三個柱子的漢諾塔比較多,這個題是四個柱子,但是我們也就是多做一步而已。

首先我們要記錄出三個柱子移動時候的情況,以便後續會用到。

所以完成這個動作的**是用到了遞推的思想:**如下:

for(int i =1 ; i <= 12; i ++)

d[i] = d[i-1]*2 + 1;

也可以用2^n-1利用位運算的寫法,如下: 

for(int i = 1; i <= 12; i ++)

d[i] = (1以上就可以將三個柱子的漢諾塔的情況分析完畢

下面進行四個柱子的分析

首先列舉情況然後遞推出結果

for(int i = 1; i <= 12; i ++)

for(int j =1; j <= i; j++)

f[i] = min(f[i],f[j]*2+d[i-j]);

善於利用遞推來降低複雜度

下面是我ac的完整**

#include#includeusing namespace std;

int d[20],f[20];

int main()

奇怪漢諾塔

奇怪漢諾塔 題目描述 漢諾塔問題,條件如下 這裡有 a b c 和 d 四座塔。這裡有 個圓盤,的數量是恆定的。每個圓盤的尺寸都不相同。所有的圓盤在開始時都堆疊在塔 a 上,且圓盤尺寸從塔頂到塔底逐漸增大。我們需要將所有的圓盤都從塔 a 轉移到塔 d 上。每次可以移動乙個圓盤,當塔為空塔或者塔頂圓盤...

奇怪的漢諾塔

漢諾塔問題,條件如下 1 這裡有a b c和d四座塔。2 這裡有n個圓盤,n的數量是恆定的。3 每個圓盤的尺寸都不相同。4 所有的圓盤在開始時都堆疊在塔a上,且圓盤尺寸從塔頂到塔底逐漸增大。5 我們需要將所有的圓盤都從塔a轉移到塔d上。6 每次可以移動乙個圓盤,當塔為空塔或者塔頂圓盤尺寸大於被移動圓...

奇怪的漢諾塔

本題是三盤漢諾塔的延伸。三盤漢諾塔我們是可以用遞推來求解的。設dp n 表示求解該n盤3塔問題的最少步數,顯然有dp n 2 dp n 1 1,既把前n 1個盤子從a柱移動b柱,在把第n個盤子從a柱移動 柱,最後又把前n 1個盤子從b柱移動到c柱。這是三塔的遞推式。那麼四塔的遞推式就是把前i個盤子移...