漢諾塔問題是乙個經典的遞迴問題,對於這個問題,我們可以把它簡單的去看成是如何用n-1去表示n。
在a,b,c三個柱子上,我們先假設a柱上只有兩個盤子,那麼很簡單,只需要把最上面的那個盤子移到b柱上,再把a柱上最下面的盤子移到c柱上,最後把b柱的盤子移到c柱就可以了。
假設我們有n個盤子,那麼可以把最下面的盤子看成是第n個盤子,而我們要做的是把上面n-1個盤子移到b柱上,再把第n個盤子移到c柱。我們可以把b柱視為主中轉站。www.cppcns.com
在將n-1個盤子移到b柱的過程中,我們需要借助c柱作為分中轉站,當完成n-1個盤子的移動時,此時b柱上存在n-1個盤子,而我們接下來要做的,和之前類似,就是借助把n-2個盤子移動到a柱,把第n-1個盤子移動到c柱。在移動n-2個盤子到a柱時,我們同樣要借助c作為分中轉站。
import turtle
class stack:
def __inwww.cppcns.comit__(self):
self.items =
def isempty(self):
return len(self.items) == 0
def push(self, item):
self.items.append(item)
def pop(self):
return self.items.pop()
def peek(self):
if not self.isempty():
return self.items[len(self.items) - 1]
def size(self):
return len(self.items)
def drawpole_3():#畫出漢諾塔的poles
t = turtle.turtle()
t.hideturtle()
def drawpole_1(k):
t.up()
t.pensize(10)
t.speed(100)
t.goto(400*(k-1), 100)
t.down()
t.goto(400*(k-1), -100)
t.goto(400*(k-1)-20, -100)
t.goto(400*(k-1)+20, -100)
drawpole_1(0)#畫出漢諾塔的poles[0]
drawpole_1(1)#畫出漢諾塔的poles[1]
drawpole_1(2)#畫出漢諾塔的poles[2]
def creat_plates(n):#製造n個盤子
plates=[turtle.turtle() for i in range(n)]
for i in range(n):
plates[i].up()
plates[i].hideturtle()
plates[i].shape("square")
plates[i].shapesize(1,8-i)
plates[i].goto(-400,-90+20*i)
plates[i].showturtle()
return plate程式設計客棧s
def pole_stack():#製造poles的棧
poles=[stack() for i in range(3)]
return poles
def movedisk(plates,poles,fp,tp):#把poles[fp]頂端的盤子plates[mov]從poles[fp]移到poles[tp]
mov=polesmwxhlyvzki[fp].peek()
plates[mov].goto((fp-1)*400,150)
plates[mov].goto((tp-1)*400,150)
l=poles[tp].size()#確定移動到底部的高度(恰好放在原來最上面的盤子上面)
plates[mov].goto((tp-1)*400,-90+20*l)
def movetower(plates,poles,height,frompole, topole, withpole):#遞迴放盤子
if height >= 1:
movetower(plates,poles,height-1,frompole,withpole,topole)
movedisk(plates,poles,frompole,topole)
poles[topole].push(poles[frompole].pop())
movetower(plates,poles,height-1,withpole,topole,frompole)
myscreen=turtle.screen()
drawpole_3()
n=int(input("請輸入漢諾塔的層數並回車:\n"))
plpoles=pole_stack()
for i in range(n):
poles[0].push(i)
movetower(plates,poles,n,0,2,1)
myscreen.exitonclick()
1.首先,會顯示出如下頁面:
因此,我們輸入漢諾塔層數。
2.turtle庫演示結果
本文標題: 利用python實現漢諾塔遊戲
本文位址:
python 漢諾塔 Python漢諾塔
import turtle class stack def init self self.items def isempty self return len self.items 0 def push self,item def pop self return self.items.pop def ...
漢諾塔遊戲
漢諾塔 於印度傳說的乙個故事,上帝創造世界時作了三根金剛石柱子,在一根柱子上從下往上按大小順序摞著64片 圓盤。上帝命令婆羅門把圓盤從下面開始按大小順序重新擺放在另一根柱子上。並且規定,在小圓盤上不能放大圓盤,在三根柱子之間一回只能移動乙個圓盤。要想玩轉漢諾塔,需要先理解遞迴。如果乙個問題可以不斷地...
漢諾塔遊戲
題目描述 在a b c三根柱子上,有n個不同大小的圓盤 設半徑分別為1 n 一開始他們都疊在a上,你的目標是在最少的合法移動步數內將所有盤子從a塔移動到c塔。遊戲中的每一步規則如下 1 每一步只允許移動乙個盤子 從一根柱子最上方到另乙個柱子的最上方 2 移動的過程中,你必須保證大的盤子不能在小的盤子...