汉诺塔

 1 n=input("输入汉诺塔碟子总数")
 2 def move(n,a,b,c):
 3     if n==1:
 4         print(a,'->',c)
 5     else:
 6         move(n-1,a,c,b)
 7         move(1,a,b,c)
 8         move(n-1,b,a,c)
 9 
10 动图:
11 import turtle
12 class Stack:
13     def __init__(self):
14         self.items = []
15     def isEmpty(self):
16         return len(self.items) == 0
17     def push(self, item):
18         self.items.append(item)
19     def pop(self):
20         return self.items.pop()
21     def peek(self):
22         if not self.isEmpty():
23             return self.items[len(self.items) - 1]
24     def size(self):
25         return len(self.items)
26  
27 def drawpole_3():#画出汉诺塔的poles
28     t = turtle.Turtle()
29     t.hideturtle()
30     def drawpole_1(k):
31         t.up()
32         t.pensize(10)
33         t.speed(100)
34         t.goto(250*(k-1), 100)
35         t.down()
36         t.goto(250*(k-1), -100)
37         t.goto(250*(k-1)-20, -100)
38         t.goto(250*(k-1)+20, -100)
39     drawpole_1(0)#画出汉诺塔的polesA
40     drawpole_1(1)#画出汉诺塔的polesB
41     drawpole_1(2)#画出汉诺塔的polesC
42  
43 def creat_plates(n):#制造n个盘子
44     plates=[turtle.Turtle() for i in range(n)]
45     for i in range(n):
46         plates[i].up()
47         plates[i].hideturtle()
48         plates[i].shape("square")
49         plates[i].shapesize(1,9-i)
50         plates[i].goto(-250,-90+20*i)
51         plates[i].showturtle()
52     return plates
53  
54 def pole_stack():#制造poles的栈
55     poles=[Stack() for i in range(3)]
56     return poles
57  
58 def moveDisk(plates,poles,fp,tp):#把polesA顶端的盘子plates[mov]从polesA移到polesC
59     mov=poles[fp].peek()
60     plates[mov].goto((fp-1)*250,150)
61     plates[mov].goto((tp-1)*250,150)
62     l=poles[tp].size()        #确定移动到底部的高度(恰好放在原来最上面的盘子上面)
63     plates[mov].goto((tp-1)*250,-90+20*l)
64  
65 def moveTower(plates,poles,height,fromPole, toPole, withPole):#递归放盘子
66     if height >= 1:
67         moveTower(plates,poles,height-1,fromPole,withPole,toPole)
68         moveDisk(plates,poles,fromPole,toPole)
69         poles[toPole].push(poles[fromPole].pop())
70         moveTower(plates,poles,height-1,withPole,toPole,fromPole)
71  
72 myscreen=turtle.Screen()
73 drawpole_3()
74 n=int(input("请输入汉诺塔的层数并回车:\n"))
75 plates=creat_plates(n)
76 poles=pole_stack()
77 for i in range(n):
78     poles[0].push(i)
79 moveTower(plates,poles,n,0,2,1)
80 myscreen.exitonclick()

 

posted @ 2020-03-31 17:34  zzh007  阅读(167)  评论(0编辑  收藏  举报