def move(n, a, b, c):
? ? if n == 1:
? ? ? ? print(a, '-->', c)
? ? else:
? ? ? ? move(n - 1, a, c, b)#將n-1塊由a繞過c搬運(yùn)至b
? ? ? ? print(a, '-->', c)#將最后一塊最大塊由a搬運(yùn)至c
? ? ? ? move(n - 1, b, a, c)#將b上的n-1塊由把繞過a搬運(yùn)至c
算法介紹
其實(shí)算法非常簡單仿荆,當(dāng)盤子的個(gè)數(shù)為n時(shí)枫耳,移動(dòng)的次數(shù)應(yīng)等于2^n – 1线梗。
后來一位美國學(xué)者發(fā)現(xiàn)一種出人意料的簡單方法腻惠,只要輪流進(jìn)行兩步操作就可以了桨嫁。
首先把三根柱子按順序排成品字型肯夏,把所有的圓盤按從大到小的順序放在柱子A上峰髓,根據(jù)圓盤的數(shù)量確定柱子的排放順序:
1)若n為偶數(shù)赴精,按順時(shí)針方向依次擺放 A B C卤妒;
2)若n為奇數(shù)甥绿,按順時(shí)針方向依次擺放 A C B。
⑴按順時(shí)針方向把圓盤1從現(xiàn)在的柱子移動(dòng)到下一根柱子则披,即當(dāng)n為偶數(shù)時(shí)共缕,若圓盤1在柱子A,則把它移動(dòng)到B士复;若圓盤1在柱子B图谷,則把它移動(dòng)到C;若圓盤1在柱子C阱洪,則把它移動(dòng)到A便贵。
⑵接著,把另外兩根柱子上可以移動(dòng)的圓盤移動(dòng)到新的柱子上冗荸。即把非空柱子上的圓盤移動(dòng)到空柱子上承璃,當(dāng)兩根柱子都非空時(shí),移動(dòng)較大的圓盤蚌本。這一步?jīng)]有明確規(guī)定移動(dòng)哪個(gè)圓盤盔粹,你可能以為會(huì)有多種可能性隘梨,其實(shí)不然,可實(shí)施的行動(dòng)是唯一的舷嗡。
⑶反復(fù)進(jìn)行⑴⑵操作轴猎,最后就能按規(guī)定完成漢諾塔的移動(dòng)。
所以結(jié)果非常簡單进萄,就是按照移動(dòng)規(guī)則向一個(gè)方向移動(dòng)金片:
如3階漢諾塔的移動(dòng):A→C,A→B,C→B,A→C,B→A,B→C,A→C