1207 ACM 漢諾塔II 數學

2021-08-22 19:17:20 字數 1043 閱讀 3534

題目:

中文題目,在原來三個柱子的情況下(漢諾塔一),增加了乙個柱子,難度也增加了。

思路:

思考時盡量和漢諾塔一聯絡起來。

1 ,先看漢諾塔一的情況

只有乙個盤子時,只需挪動一步;假如n個盤子要移動an步,則有n+1個盤子可以先通過an步把上面的n個盤子挪到第二個柱子上,再挪最大的盤子,最後把n個盤子挪到大的上面,總共2an+1步,則有a(n+1)=2an+1

以上式子可推得an=2^n-1

2,回過來看該題,該題多加了一根柱子,現在有四根柱子了,分別是a,b,c,d,計算將n個盤從第一根柱子a全部移到最後一根柱子d上所需的最少步數。

設f[n]為所求的最小步數,則有當n=1時,f[n]=1;當n=2時,f[n]=3;這裡同經典漢諾塔一樣,將移動盤子的任務分為三步:

一,將x(1<=x<=n)個盤從a柱依靠b,d柱移到c柱,這個過程需要步數設為f[x](依靠兩個柱子);

二,將a柱上剩下的n-x個盤依靠b柱移到d柱(此時不能依靠c柱,c柱上的所有盤都比a柱上的盤小),移動方式相當於是乙個漢諾塔1版,這個過程需要的步數為2^(n-x)-1(漢諾塔一)(依靠乙個柱子);

三,將c柱上的x個盤依靠a,b柱移到d柱上,這個過程同樣需要的步數為f[x];

經過以上3步即可完成任務,總步數為f[n]=f[x]+2^(n-x)-1+f[x]=2*f[x]+2^(n-x)-1;題目中要求的是最少的步數,根據上式,x的不同取值,對於同乙個n,也會得出不同的f[n]。因此答案轉化為min,其中1<=x<=n;用兩個for迴圈遍歷x的各個取值,記錄最小值即可。

注意:

1,c++裡面的冪函式pow

2,要用longlong或是(_int64 輸出%i64d)

#include

#include

int main()

while(scanf("%d",&n)!=eof)

}

杭電 1207 漢諾塔II

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

杭電1207 漢諾塔II

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

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,我們可以求出乙個...