百练OJ:4147:汉诺塔问题(Hanoi)——python实现汉诺塔
一、漢諾塔問題
??有三根桿子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。
總結
以上是生活随笔為你收集整理的百练OJ:4147:汉诺塔问题(Hanoi)——python实现汉诺塔的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python用辗转相除法求最大公约数
- 下一篇: python开源聊天机器人Chatter