用python实现汉诺塔问题
2024-09-07 02:59:01
一、用动画实现汉诺塔问题:
import turtle class Stack:
def __init__(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 plates 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=poles[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"))
plates=creat_plates(n)
poles=pole_stack()
for i in range(n):
poles[0].push(i)
moveTower(plates,poles,n,0,2,1)
myscreen.exitonclick()
二、汉诺塔问题
有三个座A、B、C,A座有n个盘子,要求把A座上的n个盘子移动到C座上,每次只能移动一个盘子,并且移动过程中始终保持大盘在下,小盘在上,在移动过程中可以利用B盘来放盘子
输出格式:输出移动的步骤,每行一步,如从A座移动到C盘,输出“A-->C”
def hanoi(n,x,y,z):
if n==1:
print(x,'-->',z)
else:
hanoi(n-1,x,z,y)
hanoi(1,x,y,z)
hanoi(n-1,y,x,z)
n=int(input())
hanoi(n,'A','B','C')
最新文章
- 我人生中的jQuery选择器
- C++的深拷贝与浅拷贝
- 开发中可能会用到的几个 jQuery 小提示和技巧
- PLSQL_数据泵导入导出数据Impdp/ Expdp(概念)
- Sina App Engine(SAE)入门教程(1)
- bzoj1391
- php 站内搜索 多表 分页
- JS 引擎的执行机制
- BZOJ4554 - [TJOI2016&HEOI2016]游戏
- nfc开发
- 【开源分享】微信营销系统(第三方微信平台)github 开源
- https协议的简单理解
- Troubleshooting ORA-12547 TNS: Lost Contact (Doc ID 555565.1)
- eclipse导入Tomcat8源码
- LambdaAOP
- UVM中的sequence使用(一)
- 数组类型的退化Decay
- Python - 入门基础(一)
- 使用ScrapySharp快速从网页中采集数据
- python常用模块之shutil模块