漢諾塔編程
① 漢諾塔的演算法
演算法介紹:當盤子的個數為n時,移動的次數應等於2^n–1。後來一位美國學者發現一種出人意料的簡單方法,只要輪流進行兩步操作就可以了。首先把三根柱子按順序排成品字型,把所有的圓盤按從大到小的順序放在柱子A上,根據圓盤的數量確定柱子的排放順序:若n為偶數,按順時針方向依次擺放A、B、C;
若n為奇數,按順時針方向依次擺放A、C、B。
所以結果非常簡單,就是按照移動規則向一個方向移動金片:如3階漢諾塔的移動:A→C,A→B,C→B,A→C,B→A,B→C,A→C
漢諾塔問題也是程序設計中的經典遞歸問題。

(1)漢諾塔編程擴展閱讀
由來:
法國數學家愛德華·盧卡斯曾編寫過一個印度的古老傳說:在世界中心貝拿勒斯(在印度北部)的聖廟里,一塊黃銅板上插著三根寶石針。印度教的主神梵天在創造世界的時候,在其中一根針上從下到上地穿好了由大到小的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億年,不說太陽系和銀河系,至少地球上的一切生命,連同梵塔、廟宇等,都早已經灰飛煙滅。
② C++ 奇怪的雙色漢諾塔問題
這和普通的漢諾塔問題是相同的。為什麼呢?
考察一個普通的漢諾塔問題,如果按照最少步驟移動(即沒有無意義的移來移去):
普通的漢諾塔(把盤子1~k由source移動到target)問題分三個階段
1.把盤子1~k-1由source(k上面)移動到assistant
2.把盤子k由source移動到target
3.把盤子1~k-1由assistant移動到target(k上面)
在這里我們把盤子1~k-1的移動看做一個整體進行移動
那麼假設存在一個違反雙色規則移動的盤子m-1,它放在了盤子m+1上,但是你讓盤子m怎麼辦呢?在移動1~m+1這個層次並沒有盤子m在m+1所在柱子之外的兩個柱子間移動的步驟。
m-1放在m+3、m+5、m+7……之上也是不可能的,因為同樣地,就拿m+3來說,在移動1~m+3這個層次沒有盤子m+2在m+3所在柱子之外的兩個柱子間移動的步驟。
所以這種違規必然是一個多餘的操作,違規地移動之後,必須要移下來才能正常繼續。
至於普通的漢諾塔問題如何解決,你大可搜到答案無需我講了吧。
③ 如何做一個C語言編程的漢諾塔游戲
#include
