Python-漢諾塔問題


概述: 

  據說古代有一個梵塔,塔內有三個底座A、B、C,A座上有64個盤子,盤子大小不等,大的在下,小的在上。

  有一個和尚想把這64個盤子從A座移到C座,但每次只能允許移動一個盤子,在移動盤子的過程中可以利用B座,但任何時刻3個座上的盤子都必須始終保持大盤在下、小盤在上的順序。如果只有一個盤子,則不需要利用B座,直接將盤子從A移動到C即可。和尚想知道這項任務的詳細移動步驟和順序。

  這實際上是一個非常巨大的工程,是一個不可能完成的任務。

  根據數學知識我們可以知道,移動n個盤子需要(2^n-1)步,64個盤子需要18446744073709551615步。如果每步需要一秒鍾的話,那么就需要584942417355.072年。

def hannuo(num, src, dst, temp=None):
    #聲明用來記錄移動次數的變量為全局變量
    global times
    #確認參數類型和范圍(可不寫)
    #----------------------------------------------------------------
    assert type(num) == int, 'num must be integer'
    assert num > 0, 'num must > 0'
    #----------------------------------------------------------------
    #只剩最后或只有一個盤子需要移動,這也是函數遞歸調用的結束條件
    if num == 1:
        print('The {0} Times move:{1}==>{2}'.format(times, src, dst))
        times += 1
    else:
        #遞歸調用函數自身,
        #先把除最后一個盤子之外的所有盤子移動到臨時柱子上
        hannuo(num-1, src, temp, dst)
        #把最后一個盤子直接移動到目標柱子上
        hannuo(1, src, dst)
        #把除最后一個盤子之外的其他盤子從臨時柱子上移動到目標柱子上
        hannuo(num-1, temp, dst, src)
#用來記錄移動次數的變量
times = 1
#A表示最初放置盤子的柱子src,C是目標柱子dst,B是臨時柱子temp
n = int(input()) hannuo(n, 'A', 'C', 'B')

n = 3時,效果如圖

  

【擴展實例】

  漢諾塔實踐

描述‪‬‪‬‪‬‪‬‪‬‮‬‪‬‮‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‭‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‭‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‭‬

請補充編程模板中代碼,完成如下功能:‪‬‪‬‪‬‪‬‪‬‮‬‪‬‮‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‭‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‭‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‭‬

有三個圓柱A、B、C,初始時A上有N個圓盤,N由用戶輸入給出,最終移動到圓柱C上。‪‬‪‬‪‬‪‬‪‬‮‬‪‬‮‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‭‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‭‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‭‬

每次移動步驟的表達方式示例如下:[STEP  10] A->C。其中,STEP是步驟序號,寬度為4個字符,右對齊。‪‬‪‬‪‬‪‬‪‬‮‬‪‬‮‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‭‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‭‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‭‬

請編寫代碼,獲得輸入N后,輸出漢諾塔移動的步驟。‪‬‪‬‪‬‪‬‪‬‮‬‪‬‮‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‭‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‭‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‭‬

輸入格式

一個整數‪‬‪‬‪‬‪‬‪‬‮‬‪‬‮‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‭‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‭‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‭‬

輸出格式

每個步驟一行,每行參考格式如下:[STEP  10] A->C‪‬‪‬‪‬‪‬‪‬‮‬‪‬‮‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‭‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‭‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‭‬

輸入輸出示例

  輸入 輸出
示例 1
3
[STEP   1] A->C
[STEP   2] A->B
[STEP   3] C->B
[STEP   4] A->C
[STEP   5] B->A
[STEP   6] B->C
[STEP   7] A->C
steps = 0
def hanoi(src, des, mid, n):
    global steps
    if n == 1:
        steps += 1
        print("[STEP{:>4}] {}->{}".format(steps, src, des))
    else:
        hanoi(src, mid, des, n-1)
        steps += 1
        print("[STEP{:>4}] {}->{}".format(steps, src, des))
        hanoi(mid, des, src, n-1)
N = eval(input())
hanoi("A", "C", "B", N)

  

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM