漢諾塔問題,條件如下:
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個盤子移...