HDU 1207 漢諾塔II(遞推)

2021-07-05 08:33:25 字數 1605 閱讀 3070

problem description

經典的漢諾塔問題經常作為乙個遞迴的經典例題存在。可能有人並不知道漢諾塔問題的典故。漢諾塔**於印度傳說的乙個故事,上帝創造世界時作了三根金剛石柱子,在一根柱子上從下往上按大小順序摞著64片**圓盤。上帝命令婆羅門把圓盤從下面開始按大小順序重新擺放在另一根柱子上。並且規定,在小圓盤上不能放大圓盤,在三根柱子之間一回只能移動乙個圓盤。有預言說,這件事完成時宇宙會在一瞬間閃電式毀滅。也有人相信婆羅門至今仍在一刻不停地搬動著圓盤。恩,當然這個傳說並不可信,如今漢諾塔更多的是作為乙個玩具存在。gardon就收到了乙個漢諾塔玩具作為生日禮物。

gardon是個怕麻煩的人(恩,就是愛偷懶的人),很顯然將64個圓盤逐一搬動直到所有的盤子都到達第三個柱子上很困難,所以gardon決定作個小弊,他又找來了一根一模一樣的柱子,通過這個柱子來更快的把所有的盤子移到第三個柱子上。下面的問題就是:當gardon在一次遊戲中使用了n個盤子時,他需要多少次移動才能把他們都移到第三個柱子上?很顯然,在沒有第四個柱子時,問題的解是2^n-1,但現在有了這個柱子的幫助,又該是多少呢?

input

包含多組資料,每個資料一行,是盤子的數目n(1<=n<=64)。

output

對於每組資料,輸出乙個數,到達目標需要的最少的移動數。

sample input

1312

sample output

1

581

【思路分析】

多加了一根柱子的漢諾塔問題。設a,b,c,d四根柱子,要求把a上所有的盤子移到d上,求最少移動次數。一開始的思路受到三根柱子漢諾塔的束縛,即把上面(n - 2)個盤子借助c、d移動到b上,把第(n - 1)個盤子移到c上,把第n個盤子移到d上,再將第(n - 1)個盤子由c移到d上,最後把(n - 2)個盤子由b借助a、c移到d上。可是結果報wa。

原因是移動上面(n - i)(i從1到n - 1)個盤子的每一種情況都是不同的,不能僅僅通過(n - 2)個求最小移動次數,這樣太片面了,需要從(n - 1)種情況選出乙個最小值才是正確結果。

上述問題就是frame演算法:(設盤子總數為i)

1、把a的上面j個盤子借助c、d移到b ——  hanoi[j]步

2、把a的剩餘(i - j)個盤子通過c移到d(即三柱漢諾塔)——  2 ^ (i - j) - 1 步

3、把b的j個盤子借助a、c移到d ——  hanoi[j]步

最後,當j從1到(i - 1)時,上述三步之和的最小值就是i個盤子四柱漢諾塔的最終結果。遞迴方程為hanoi[i] = min(2 * hanoi[j] + 2 ^ (i - j) - 1)。

**如下:

#include #include #include #include #include #include using namespace std;

const int maxn = 65;

const int inf = 999999999;

int hanoi[maxn];

void solve()

}hanoi[i] = minx;

}}int main()

return 0;

}

hdu1207漢諾塔II四柱

題目鏈結 problem description 經典的漢諾塔問題經常作為乙個遞迴的經典例題存在。可能有人並不知道漢諾塔問題的典故。漢諾塔 於印度傳說的乙個故事,上帝創造世界時作了三根金剛石柱子,在一根柱子上從下往上按大小順序摞著64片 圓盤。上帝命令婆羅門把圓盤從下面開始按大小順序重新擺放在另一根...

杭電 1207 漢諾塔II

漢諾塔ii problem description 經典的漢諾塔問題經常作為乙個遞迴的經典例題存在。可能有人並不知道漢諾塔問題的典故。漢諾塔 於印度傳說的乙個故事,上帝創造世界時作了三根金剛石柱子,在一根柱子上從下往上按大小順序摞著64片 圓盤。上帝命令婆羅門把圓盤從下面開始按大小順序重新擺放在另一...

杭電1207 漢諾塔II

經典的漢諾塔問題經常作為乙個遞迴的經典例題存在。可能有人並不知道漢諾塔問題的典故。漢諾塔 於印度傳說的乙個故事,上帝創造世界時作了三根金剛石柱子,在一根柱子上從下往上按大小順序摞著64片 圓盤。上帝命令婆羅門把圓盤從下面開始按大小順序重新擺放在另一根柱子上。並且規定,在小圓盤上不能放大圓盤,在三根柱...