今天校內賽考了一下多柱漢諾塔問題,其中有
n 個盤子,
m根柱子,
n<=63,
3<=
m<=n+
1 (實踐證明n=
64 就會爆lo
nglo
ng)。
我們回憶一下只有三根柱子的情況:
−1個盤子移到第二根柱子上,再把剩下的那乙個盤子移到第三根柱子,最後再把n−
1 個盤子移到第三根柱子上。
如果我們用fn
來表示移動(三根柱子時)
n 個盤子的最小步數,按照上面的敘述,則有: fn
=2×f
n−1+
1這樣乙個遞推式,不寫出它的通項公式是2n
−1。
我們再考慮四根柱子的情況。
我們按照同樣的思路,考慮到底是先留幾個盤子,先移幾個盤子。我們設留下
r 個盤子,移動n−
r個盤子把他們放到第三根柱子上,再用剩下的三根柱子把移動剩下的
r 個盤子移動到第4根柱子上。我們同樣用fn
來表示移動
n 個盤子的最小步數,就有這樣乙個式子: fn
=min
(2×f
n−r+
2r−1
)同樣的,如果定義dp
[i][
j]為把
i 個盤子移動到
j根柱子的最小步數,就有: dp
[i][
j]=m
in(2
×dp[
i−r]
[j]+
dp[r
][j−
1]),
1<=
r<=i
關於初值,無疑dp
陣列要賦+i
nf,對於邊界,也就是n=
1,m=
1,n=
2,m=
2 的情況也要分別計算(我順手把m=
3 的情況也算出來了)。
**如下:
#include
#include
#include
#define name "hanoi"
using
namespace
std;
const
int n=63;
int n,m;
long
long dp[n+5][n+5];
int main()
多柱漢諾塔問題「通解」 c
有位同學看到了我的初賽模擬卷上有一道關於漢諾塔的數學題。大概就是要求4柱20盤的最小移動次數。他的數學很不錯,找到了應該怎樣推。如果要把n個盤子移到另乙個柱子上,步驟如下 把一部分盤子 靠上的r個 移到一根空柱子上,移動過程中可用的柱子有4根 將剩下的n r個盤子移到另一根空柱子上,移動過程中可用的...
hdoj1207 漢諾塔II 多柱漢諾塔問題
題目鏈結 思路 首先這是個多柱漢諾塔問題,對於n階漢諾塔,具體步驟如下 1.首先我們將x個盤子移到b柱,步數為step x 2.然後將n x個盤子移到c柱,步數為2 n x 1 3.最後我們再將b柱上的x個盤子移到c柱,步數為step x 4.上面的x在1到n之間取值,對於每乙個x,我們可以求出乙個...
怎麼理解漢羅塔問題 漢諾塔問題(三柱及四柱)詳解
漢諾塔 hanoi tower 又稱河內塔,傳說大梵天創造世界的時候做了三根金剛石柱子,在一根柱子上從下往上按照大小順序摞著64片 圓盤。大梵天命令婆羅門把圓盤從下面開始按大小順序重新擺放在另一根柱子上。並且規定,任何時候,在小圓盤上都不能放大圓盤,且在三根柱子之間一次只能移動乙個圓盤。問應該如何操...