奇怪的漢諾塔

2021-09-24 16:09:00 字數 1917 閱讀 5450

漢諾塔問題,條件如下:

1、這裡有 a、b、c 和 d 四座塔。

2、這裡有 n 個圓盤,n 的數量是恆定的。

3、每個圓盤的尺寸都不相同。

4、所有的圓盤在開始時都堆疊在塔 a 上,且圓盤尺寸從塔頂到塔底逐漸增大。

5、我們需要將所有的圓盤都從塔 a 轉移到塔 d 上。

6、每次可以移動乙個圓盤,當塔為空塔或者塔頂圓盤尺寸大於被移動圓盤時,可將圓盤移至這座塔上。

請你求出將所有圓盤從塔 a 移動到塔 d ,所需的最小移動次數是多少。

輸入格式

沒有輸入

輸出格式

對於每乙個整數 n (1≤n

≤12

1 ≤n≤12

1≤n≤12

),輸出乙個滿足條件的最小移動次數,每個結果佔一行。

資料範圍1≤n

≤12

1≤n≤12

1≤n≤12

輸入樣例:

輸出樣例:

135

9131725

3341

4965

81

本題目是乙個關於四塔漢諾塔問題,我們首先考慮一下三塔漢諾塔問題。

三塔漢諾塔是使用遞迴進行求解移動順序的,但是可以使用遞推得到移動的步數。

假定 a 塔上有 n 個圓盤,我們可以借助 c 塔將 (n - 1) 個圓盤移動到 b 塔,然後將 a 塔上最後乙個圓盤移動到 c 塔,b塔中的所有圓盤移動到 c 塔,這樣就實現了從 a 塔移動到 c塔。

假定將 n 個圓盤從 a 塔移動到 c 塔,所需步數為 f[n],那麼可以得到這樣的遞推式:

f [n

]=f[

n−1]

+1+f

[n−1

]=2×

f[n−

1]+1

f[n] = f[n - 1] + 1 + f[n - 1] = 2 \times f[n - 1] + 1

f[n]=f

[n−1

]+1+

f[n−

1]=2

×f[n

−1]+

1現在考慮四塔漢諾塔的移動步數。

假定 a 塔上有 n 個圓盤,我們可以借助 c、d塔將 j 個圓盤移動到 b 塔上。剩餘的 (n - j) 個圓盤借助於 c 塔移動到 d 塔上,然後借助於 a、c塔將 b 塔上的 j 個圓盤移動到 d 塔上,這樣就實現了從 a 塔移動到 d 塔。

但是我們不能夠確定最初應該移動幾個圓盤到 b 塔上,才能使得移動步數最短,因此需要遍歷可能結果尋找最短步數。

假定將 n 個圓盤從 a 塔移動到 d 塔,所需步數為 d[n],那麼可以得到這樣的遞推式:

d [n

]=d[

j]+f

[n−j

]+d[

j]=2

∗d[j

]+f[

n−j]

d[n] = d[j] + f[n - j] + d[j] = 2 * d[j] + f[n - j]

d[n]=d

[j]+

f[n−

j]+d

[j]=

2∗d[

j]+f

[n−j

]

#include #include using namespace std;

int main()

four[0] = 0;

for(int i = 0;i < 13;i++)

}for(int i = 1;i < 13;i++)

return 0;

}

奇怪漢諾塔

奇怪漢諾塔 題目描述 漢諾塔問題,條件如下 這裡有 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個盤子移...