百練OJ:4147:漢諾塔問題(Hanoi)——python實現漢諾塔

kangyucheng發表於2018-01-19

一、漢諾塔問題

  有三根杆子A,B,C。A杆上有N個(N>1)穿孔圓盤,盤的尺寸由下到上依次變小。要求按下列規則將所有圓盤移至C杆: 每次只能移動一個圓盤; 大盤不能疊在小盤上面。 提示:可將圓盤臨時置於B杆,也可將從A杆移出的圓盤重新移回A杆,但都必須遵循上述兩條規則。

  問:如何移?最少要移動多少次?

漢諾塔示意圖如下:


二、故事由來 

    法國數學家愛德華·盧卡斯曾編寫過一個印度的古老傳說:在世界中心貝拿勒斯(在印度北部)的聖廟裡,一塊黃銅板上插著三根寶石針。印度教的主神梵天在創造世界的時候,在其中一根針上從下到上地穿好了由大到小的64片金片,這就是所謂的漢諾塔。不論白天黑夜,總有一個僧侶在按照下面的法則移動這些金片:一次只移動一片,不管在哪根針上,小片必須在大片上面。僧侶們預言,當所有的金片都從梵天穿好的那根針上移到另外一根針上時,世界就將在一聲霹靂中消滅,而梵塔、廟宇和眾生也都將同歸於盡。

    不管這個傳說的可信度有多大,如果考慮一下把64片金片,由一根針上移到另一根針上,並且始終保持上小下大的順序。這需要多少次移動呢?這裡需要遞迴的方法。假設有n片,移動次數是f(n).顯然f(1)=1,f(2)=3,f(3)=7,且f(k+1)=2*f(k)+1。此後不難證明f(n)=2^n-1。n=64時, 假如每秒鐘一次,共需多長時間呢?一個平年365天有31536000 秒,閏年366天有31622400秒,平均每年31556952秒,計算一下: 18446744073709551615秒 這表明移完這些金片需要5845.54億年以上,而地球存在至今不過45億年,太陽系的預期壽命據說也就是數百億年。真的過了5845.54億年,不說太陽系和銀河系,至少地球上的一切生命,連同梵塔、廟宇等,都早已經灰飛煙滅。

三、解法

  解法的基本思想是遞迴。假設有A、B、C三個塔,A塔有N塊盤,目標是把這些盤全部移到C塔。那麼先把A塔頂部的N-1塊盤移動到B塔,再把A塔剩下的大盤移到C,最後把B塔的N-1塊盤移到C。 每次移動多於一塊盤時,則再次使用上述演算法來移動。

輸入輸入為一個整數後面跟三個單字元字串。
整數為盤子的數目,後三個字元表示三個杆子的編號。輸出輸出每一步移動盤子的記錄。一次移動一行。
每次移動的記錄為例如3:a->b 的形式,即把編號為3的盤子從a杆移至b杆。
我們約定圓盤從小到大編號為1, 2, ...n。即最上面那個最小的圓盤編號為1,最下面最大的圓盤編號為n。樣例輸入
3 a b c
樣例輸出
1:a->c
2:a->b
1:c->b
3:a->c
1:b->a
2:b->c
1:a->c
解法:
def move( num, sour, dest):
    print(num, end=':')
    print(sour, end='->')
    print(dest)

def hanoi( num, sour, tem, dest):
    if num == 1:
        move(num, sour, dest)
    else:
        hanoi(num-1, sour, dest, tem)
        move(num, sour, dest)
        hanoi(num-1, tem, sour, dest)

n=input()
hanoi(int (n.split()[0]),n.split()[1],n.split()[2],n.split()[3])


相關文章