hanoi漢諾雙塔問題
題目描述
給定a,b,c三根足夠長的細柱,在a柱上放有2n個中間有孔的圓盤,共有n個不同的尺寸,每個尺寸都有兩個相同的圓盤,注意這兩個圓盤是不加區分的。現要將這些圓盤移到c柱上,在移動過程中可放在b柱上暫存。要求:
(1)每次只能移動乙個圓盤;
(2) a、b、c三根細柱上的圓盤都要保持上小下大的順序;
任務:設an為2n個圓盤完成上述任務所需的最少移動次數,對於輸入的n,輸出an。
輸入資料
輸入為乙個正整數 n ,表示在 a 柱上放有 2n 個圓盤。
輸出資料
輸出檔案hanoi.out僅一行,包含乙個正整數,為完成上述任務所需的最少移動次數 an 。
樣例輸入
sample 1:
sample 2:
樣例輸出
sample 1:
sample 2:
樣例說明
對於50%的資料, 1< =n< =25
對於100% 資料, 1< =n< =200
原始的漢諾塔問題:漢諾塔大家應該都知道,也應該都直到漢諾塔的遞推公式是什麼。怎樣簡單的理解呢?不用太多的推算,建議大家這樣理解:對於n個盤子來說,前n-1個圓盤全部移走之前,第n個圓盤肯定是一直在初始的桿子的最下面。而且又因為第n個是最大的,它不能放到任何盤子上方,所以在移動前n-1個圓盤的時候,最大的那個可以忽略。然後,把n-1個圓盤移到第二根桿子上之後(這時已經移動了f(n-1)次),是不是只有最大的那個還在原來的桿子上?這時,把最大的那個圓盤移到第三根桿子上,這又移動了一次,然後幹什麼呢?把那n-1個圓盤移到第三根桿子上!又是f(n-1)次!所以f(n)=2*f(n-1)+1!
漢諾雙塔:看懂上一段的,應該已經領會到漢諾n塔的精髓了。無非就是先把n-1組圓盤移到第二根桿子上,然後把第n組圓盤移到第三根桿子上,然後再把n-1組圓盤移到第三根桿子上,一共移動了f(n)=2*f(n-1)+n次。
坑爹之處:你以為這就完了?你可太天真了(因為我就是這麼天真,哼)!這題裡面可能出現的數高達200,到那會兒早就超過了unsigned long long的範圍。所以如果用c++的話就要用高精度。具體就是用陣列來儲存數字的每一位,然後人為的實現加法和進製,最後輸出陣列就可以了。
然而資料太大這種問題怎麼能讓我們人類考慮呢?然後我就選擇了python…
python不用考慮這個問題!多大的數都可以!哈哈哈!
這是python**,是不是很簡潔……
def hanoi(n):
if n == 1:
return 2
else:
f = 2 * hanoi(n - 1) + 2
return f
a = int(input())
print(hanoi(a))
漢諾雙塔問題python Hanoi漢諾雙塔問題
hanoi漢諾雙塔問題 題目描述 給定a,b,c三根足夠長的細柱,在a柱上放有2n個中間有孔的圓盤,共有n個不同的尺寸,每個尺寸都有兩個相同的圓盤,注意這兩個圓盤是不加區分的。現要將這些圓盤移到c柱上,在移動過程中可放在b柱上暫存。要求 1 每次只能移動乙個圓盤 2 a b c三根細柱上的圓盤都要保...
漢諾雙塔問題python Hanoi雙塔問題
hanoi 雙塔問題 hanoi.pas c cpp 問題描述 給定a bc三根足夠長的細柱,在 a柱上放有 2n個中間有孔的圓盤,共有 n個不同的尺 寸,每個尺寸都有兩個相同的圓盤,注意這兩個圓盤足不加區分的 下圖為n 3 的情形。現要將 這些圓盤移到 c柱上,在移動過程中可放在 b柱上暫存。要求...
漢諾雙塔 (高精度)
由普通漢諾塔問題,設數量為n時移動次數為a n 則a n a n 1 1 a n 1 2 a n 1 1.因為a 1 1,所以a n 2 n 1.找規律?故雙塔就是2 2 n 1 但這裡沒用到 因為資料忒大,所以得用高精度。這裡參考了別人的 思路就是用陣列來儲存每一位數。1 include2 inc...