NYOJ 89 漢諾塔(二)

2021-07-09 23:21:31 字數 1210 閱讀 8270

時間限制:

3000 ms  |  記憶體限制:

65535 kb

難度:5 描述

漢諾塔的規則這裡就不再多說了,詳見題目:漢諾塔(一)

現在假設規定要把所有的金片移動到第三個針上,給你任意一種處於合法狀態的漢諾塔,你能計算出從當前狀態移動到目標狀態所需要的最少步數嗎?

輸入

第一行輸入乙個整數n,表示測試資料的組數(0輸出

輸出從當前狀態所所有的金片都移動到編號為3的針上所需要的最少總數

樣例輸入

2

31 1 1

31 1 3

樣例輸出

7

我們要把所有的金片都移動到第三個柱子上,就要把從大到小的金片依次移動到第三根柱子上。

先判斷最大的金片是不是在第三根柱子上,如果在,就不需要移動;如果不在,則:

先要把前k-1個金片移動到第2個柱子上(假設最開始第k個金片在1號柱子上),此時的狀態,移動到最後的狀態需要:1+2^(k-1)-1=2^(k-1)

其中1表示:第k個金片移到第3根柱子上需要1步;

2^(k-1)-1表示:前k-1個金片移動到第3跟柱子上的步數;

step[i]=2 ^ i ;表示第 i 個狀態移動到目標狀態的需要的步數;

假設總共有6個金片,

初始狀態為:

3     2     1

6     4     5

則共需要5個狀態;

其中最後乙個狀態是:12

346    5

此時移動到最後結果需要的步數為step[5]=32;

for(i=n-1;i>=0;i--)

}

其中 i 倒序遍歷,從最大的開始計算,如果最大的不在第三根柱子上,則加上由狀態5移動到目的狀態的步數;

t=6-num[i]-t;  //當為狀態5時(此時並不是真正移動的狀態5,而是初始狀態下討論),下乙個金片需要到底的目標狀態,即第5個金片是不是在柱子2上。此時,相當於遞迴。

ac**如下:

#include#includeint step[33],num[33];

void find()

int main()

} printf("%d\n",sum);

}}

nyoj89 漢諾塔(二)

題目 漢諾塔問題的經典結論 把i個盤子從乙個柱子整體移到另乙個柱子最少需要步數是 2的i次方減一。那我們這個給定乙個初始局面,求他到目標局面 全部移到第三個柱子上 需要的最少步數。怎麼辦呢!分析 1 總的來說一定是先把最大的盤子移到第三個柱子上,然後再把第二大的移到柱子3上,然後再把第三大的盤子移到...

nyoj 漢諾塔(一)

漢諾塔 一 描述 在印度,有這麼乙個古老的傳說 在世界中心貝拿勒斯 在印度北部 的聖廟裡,一塊黃銅板上插著三根寶石針。印度教的主神梵天在創造世界的時候,在其中一根針上從下到上地穿好了由大到小的64片金片,這就是所謂的漢諾塔。不論白天黑夜,總有乙個僧侶在按照下面的法則移動這些金片 一次只移動一片,不管...

NYOJ 漢諾塔(一)

時間限制 1000 ms 記憶體限制 65535 kb 難度 3 描述在印度,有這麼乙個古老的傳說 在世界中心貝拿勒斯 在印度北部 的聖廟裡,一塊黃銅板上插著三根寶石針。印度教的主神梵天在創造世界的時候,在其中一根針上從下到上地穿好了由大到小的64片金片,這就是所謂的漢諾塔。不論白天黑夜,總有乙個僧...