題目描述
這裡有 a、b、c 和 d 四座塔。
這裡有 個圓盤, 的數量是恆定的。
每個圓盤的尺寸都不相同。
所有的圓盤在開始時都堆疊在塔 a 上,且圓盤尺寸從塔頂到塔底逐漸增大。
我們需要將所有的圓盤都從塔 a 轉移到塔 d 上。
每次可以移動乙個圓盤,當塔為空塔或者塔頂圓盤尺寸大於被移動圓盤時,可將圓盤移至這座塔上。 請你求出將所有圓盤從塔 a 移動到塔 d,所需的最小移動次數是多少。
輸入格式
沒有輸入。
輸出格式
對於每乙個整數n(1
<=n
<=12
n(1<=n<=12
n(1<=n
<=1
2,輸出乙個滿足條件的最小移動次數,每個結果佔一行。
解題思路
首先考慮3座塔的漢諾塔問題,我們設d(n
)d(n)
d(n)
表示n個盤子3座塔的最優步數,我們需要先把n−1
n-1n−
1個盤子移到b柱上,最優步數為d(n
−1
)d(n-1)
d(n−1)
,然後把a柱上的剩餘的乙個盤子移到c柱上,步數為1,最後把b柱上的n−1
n-1n−
1個盤子移到c柱上,最優步數也為d(n
−1
)d(n-1)
d(n−1)
。固有遞推式:d(n
)=2∗
d(n−
1)+1
d(n)=2*d(n-1)+1
d(n)=2
∗d(n
−1)+
1。回到本題,設f(n
)f(n)
f(n)
表示n個盤子4座塔的最優步數,考慮從a柱移動j(0
<=j
<=n
)j(0<=j<=n)
j(0<=j
<=n
)個盤子到b柱上,最優步數為f(j
)f(j)
f(j)
。再將n−j
n-jn−
j個盤子移動到d柱上,考慮b柱上圓盤尺寸小,不能放盤子了,故變成了3塔模式,最優步數為d(n
−j
)d(n-j)
d(n−j)
,最後再將j個盤子移動到d柱上,最優步數為f(j
)f(j)
f(j)
。考慮所有的j,固有遞推式:f(n
)=mi
n(2∗
f(j)
+d(n
−j),
f(n)
f(n)=min
f(n)=m
in(2
∗f(j
)+d(
n−j)
,f(n
)**
#include
#include
using
namespace std;
const
int inf=
2147483600
;int d[20]
,f[20];
intmain()
}
YbtOJ 基礎演算法第一章例題2 奇怪漢諾塔
漢諾塔問題,條件如下 這裡有 a b c 和 d 四座塔。這裡有 個圓盤,的數量是恆定的。每個圓盤的尺寸都不相同。所有的圓盤在開始時都堆疊在塔 a 上,且圓盤尺寸從塔頂到塔底逐漸增大。我們需要將所有的圓盤都從塔 a 轉移到塔 d 上。每次可以移動乙個圓盤,當塔為空塔或者塔頂圓盤尺寸大於被移動圓盤時,...
遞推 B 例題2 奇怪漢諾塔
漢諾塔問題,條件如下 這裡有 a aa b bb c cc 和 d dd 四座塔。這裡有 n nn個圓盤,n nn 的數量是恆定的。每個圓盤的尺寸都不相同。所有的圓盤在開始時都堆疊在塔 a aa上,且圓盤尺寸從塔頂到塔底逐漸增大。我們需要將所有的圓盤都從塔 a aa 轉移到塔 d dd 上。每次可以...
第2周專案3(2) 漢諾塔
問題及 檔名稱 cpp.cbp 作 者 宋晨 完成日期 2015年9月13日 版 本 號 v1.0 問題描述 有乙個印度的古老傳說 在世界中心貝拿勒斯 在印度北部 的聖廟裡,一塊黃銅板上插著三根 寶石針。印度教的主神梵天在創造世界的時候,在其中一根針上從下到上地穿好了由大到小的64 片金片,這就是所...