漢諾塔問題,條件如下:
這裡有 a
aa、b
bb、c
cc 和 d
dd 四座塔。 這裡有 n
nn個圓盤,n
nn 的數量是恆定的。
每個圓盤的尺寸都不相同。
所有的圓盤在開始時都堆疊在塔 a
aa上,且圓盤尺寸從塔頂到塔底逐漸增大。
我們需要將所有的圓盤都從塔 a
aa 轉移到塔 d
dd 上。
每次可以移動乙個圓盤,當塔為空塔或者塔頂圓盤尺寸大於被移動圓盤時,可將圓盤移至這座塔上。
請你求出將所有圓盤從塔 a
aa 移動到塔d
dd,所需的最小移動次數是多少。
沒有輸入。
對於每乙個整數 n(1
≤n≤12
)n(1 ≤ n ≤ 12)
n(1≤n≤
12),輸出乙個滿足條件的最小移動次數,每個結果佔一行。
看題目,是漢諾塔,只是常規的三塔變成了四塔.
那麼我們就考慮四塔的做法.
首先我們定義did_
di為三塔時n
nn個盤從a
aa塔到c
cc塔所需的步數.
那麼可以得出(證明略):
d 1=
1d_ = 1
d1=1di=
di−1
∗2−1
(i
>1)
d_ = d_*2-1~~~~~~~~~~~~~~(i>1)
di=di
−1∗
2−1(
i>1)
然後我們定義f(i
)f(i)
f(i)
為四塔漢諾塔的最優步數為考慮四塔漢諾塔的演算法思想,叫frame演算法:
用四柱漢諾塔演算法把a
aa柱上部分的n−r
n- r
n−r個碟子通過c
cc柱和d
dd柱移到b
bb柱上(為f(n
−r
)f( n- r )
f(n−r)
步)。
用三柱漢諾塔經典演算法把a
aa柱上剩餘的r
rr個碟子通過c
cc柱移到d
dd柱上(三塔漢諾塔r
rr盤的步數)。
用四柱漢諾塔演算法把b
bb柱上的n−r
n-rn−
r個碟子通過a
aa柱和c
cc柱移到d
dd柱上(為f(n
−r
)f(n-r)
f(n−r)
步)。
依據上邊規則求出所有r(1
≤r≤n
)r(1≤r≤n)
r(1≤r≤
n)情況下步數f(n
)f(n)
f(n)
,取最小值得最終解。
f [i
]=mi
n& f[i]\\ & 2 * f[j] + d[i - j]\\ \end\right.
f[i]=m
infor(
int i =
1; i <=12;
++ i)
printf (
"%d\n"
, f[i]);
return0;
}
奇怪的漢諾塔 遞推
漢諾塔問題,條件如下 1 這裡有a b c和d四座塔。2 這裡有n個圓盤,n的數量是恆定的。3 每個圓盤的尺寸都不相同。4 所有的圓盤在開始時都堆疊在塔a上,且圓盤尺寸從塔頂到塔底逐漸增大。5 我們需要將所有的圓盤都從塔a轉移到塔d上。6 每次可以移動乙個圓盤,當塔為空塔或者塔頂圓盤尺寸大於被移動圓...
奇怪漢諾塔
奇怪漢諾塔 題目描述 漢諾塔問題,條件如下 這裡有 a b c 和 d 四座塔。這裡有 個圓盤,的數量是恆定的。每個圓盤的尺寸都不相同。所有的圓盤在開始時都堆疊在塔 a 上,且圓盤尺寸從塔頂到塔底逐漸增大。我們需要將所有的圓盤都從塔 a 轉移到塔 d 上。每次可以移動乙個圓盤,當塔為空塔或者塔頂圓盤...
奇怪的漢諾塔
漢諾塔問題,條件如下 1 這裡有a b c和d四座塔。2 這裡有n個圓盤,n的數量是恆定的。3 每個圓盤的尺寸都不相同。4 所有的圓盤在開始時都堆疊在塔a上,且圓盤尺寸從塔頂到塔底逐漸增大。5 我們需要將所有的圓盤都從塔a轉移到塔d上。6 每次可以移動乙個圓盤,當塔為空塔或者塔頂圓盤尺寸大於被移動圓...