在印度,有這麼乙個古老的傳說:在世界中心貝拿勒斯(在印度北部)的聖廟裡,一塊黃銅板上插著三根寶石針。印度教的主神梵天在創造世界的時候,在其中一根針上從下到上地穿好了由大到小的64片金片,這就是所謂的漢諾塔。不論白天黑夜,總有乙個僧侶在按照下面的法則移動這些金片:一次只移動一片,不管在哪根針上,小片必須在大片上面。僧侶們預言,當所有的金片都從梵天穿好的那根針上移到另外一根針上時,世界就將在一聲霹靂中消滅,而梵塔、廟宇和眾生也都將同歸於盡。
現在請你計算出起始有m個金片的漢諾塔金片全部移動到另外乙個針上時需要移動的最少步數是多少?(由於結果太大,現在只要求你算出結果的十進位制位最後六位)
第一行是乙個整數n表示測試資料的組數(0輸出把金片起始針上全部移動到另外乙個針上需要移動的最少步數的十進位制表示的最後六位。
本題並不是像一般漢諾塔問題那樣使用遞迴進行求解,而是一道比較簡單的找規律問題,
我們將金片由1個開始進行搬運,會發現以下規律:
當金片個數為1時,搬運次數為1;
當金片個數為2時,搬運次數為3;
當金片個數為3時,搬運次數為7;
當金片個數為4時,搬運次數為15;
由此可知,搬運次數為2的n次方減1;
但是題目中的起始金片數較大,如果單純的計算搬運次數,會超出整型的資料範圍,
所以在每次計算的時候直接進行取餘來減小資料量,而次方數使用快速冪演算法,保證
時間不會超限;
關於快速冪的簡單介紹,
舉乙個簡單例子,對於2的四次方,我們由2*2*2*2寫成4*4的形式,減少運算量;
如2的100次方吧,再進行乙個舉例:
2^100=4^50=16^25
(我們可以發現此時是16的25次冪,25是個奇數,此時進行以下變換)
16^25=16*16^24=16*(16*16)^12(我們將16進行一次單獨計算,剩餘的部分再進行運算)
實現**如下
#includeint main()
printf("%lld\n",num-1); //由於規律是2的n次方-1,所以輸出時要減去1
}}
python 漢諾塔 Python漢諾塔
import turtle class stack def init self self.items def isempty self return len self.items 0 def push self,item def pop self return self.items.pop def ...
漢諾塔合集之漢諾塔3
漢諾塔3 步驟分析 1.當只有乙個圓盤時,要從a到b再到c 2.同樣擴充套件經典漢諾塔問題來看,先把a柱上 n 1 個圓盤,經b移動到c 3.把最後乙個圓盤從a移動到b 4.把c柱上的 n 1 個圓盤,經b移動 移回 到a 5.把b上的最後乙個圓盤從b移到c 6.最後把a上的 n 1 個圓盤經過b移...
nyoj 漢諾塔(一)
漢諾塔 一 描述 在印度,有這麼乙個古老的傳說 在世界中心貝拿勒斯 在印度北部 的聖廟裡,一塊黃銅板上插著三根寶石針。印度教的主神梵天在創造世界的時候,在其中一根針上從下到上地穿好了由大到小的64片金片,這就是所謂的漢諾塔。不論白天黑夜,總有乙個僧侶在按照下面的法則移動這些金片 一次只移動一片,不管...