時間限制:
3000 ms | 記憶體限制:
65535 kb
難度:5 描述
漢諾塔的規則這裡就不再多說了,詳見題目:漢諾塔(一)
現在假設規定要把所有的金片移動到第三個針上,給你任意一種處於合法狀態的漢諾塔,你能計算出從當前狀態移動到目標狀態所需要的最少步數嗎?
輸入
第一行輸入乙個整數n,表示測試資料的組數(0輸出
輸出從當前狀態所所有的金片都移動到編號為3的針上所需要的最少總數
樣例輸入
231 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片金片,這就是所謂的漢諾塔。不論白天黑夜,總有乙個僧...