古代有一座汉诺塔,塔内有3个座A、B、C,A座上有n个盘子,盘子大小不等,大的在下,小的在上,如图所示。

有一个和尚想把这n个盘子从A座移到C座,但每次只能移动一个盘子,并且自移动过程中,3个座上的盘子始终保持大盘在下,小盘在上。在移动过程中可以利用B座来放盘子。

现在我编写一个程序(其实就是运用了递归思想)输入一个正整数,表示汉诺塔内的盘子个数n(1<=n<=64)然后输出移动的步骤。

步骤一:代码如下:

def move(x,y):

print("%s --> %s"%(x,y))

def hanoi(n,one,two,three):

if n==1:

move(one,three)

else:

hanoi(n-1,one,three,two)

move(one,three)

hanoi(n-1,two,one,three)

def main():#main函数

m=int(input())#输入盘子个数

hanoi(m,'A','B','C')

main()

步骤二:执行代码,现在我输入4,即4个盘子,看看搬运的步骤是怎么样的:

附:用turtle画出步骤则更直观,也更有趣,下面用turtle画出搬运过程:

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()#代码参考https://blog.csdn.net/beerbread134/article/details/69226991

python第五章课后答案汉诺塔_用python编写一个程序,得到汉诺塔的解决方案相关推荐

  1. 通信原理樊信昌_通信原理樊信昌第五章课后答案

    通信原理樊信昌第五章课后答案 更多相关问题 下列账簿中,一般采用活页账形式的是() [单选题]<天启宫词>中有一诗句:纤玉剥残双郭索,落花蝶舞唾生香.此句描绘的是吃哪种美食的场景 . 拉卜 ...

  2. 数据结构(C语言)第二版 第五章课后答案

    数据结构(C语言)第二版 第五章课后答案 1~5 A D D C A 6~10 C C B D C 11~15 B C A C A 1.选择题 (1)把一棵树转换为二叉树后,这棵二叉树的形态是(A) ...

  3. Java黑皮书课后题第9章:*9.4(使用Random类)编写一个程序,创建一个种子为1000的Random对象,然后使用nextInt(100)方法显示0到100之间的前50个随机整数

    Java黑皮书课后题第9章:*9.4(使用Random类)编写一个程序,创建一个种子为1000的Random对象,然后使用nextInt方法显示0到100之间的前50个随机整数 题目 赘述 代码 题目 ...

  4. python第五章课后题答案_python程序设计基础(嵩天)第五章课后习题部分答案

    原博文 2019-10-13 13:50 − 第五章p1515.2:实现isodd()函数,参数为整数,如果参数为奇数,返回true,否则返回false.def isodd(s): x=eval(s) ...

  5. python第三章课后答案_XX医学院本科各专业《Python》第三章习题与答案-2020年实用精品...

    XX医学院本科各专业<Python>第三章习题与答案 一.填空题 1.python语言提供.和3种数字类型.(整数.浮点数.复数) 2.整数类型有4种进制表示,默认情况采用十进制,二进制数 ...

  6. (~最新合集~)计算机网络谢希仁第七版 第五章课后答案

    5-01 试说明运输层在协议栈中的地位和作用,运输层的通信和网络层的通信有什么重要区别?为什么运输层是必不可少的? 答:运输层处于面向通信部分的最高层,同时也是用户功能中的最低层,向它上面的应用层提供 ...

  7. 【传智播客】Javaweb程序设计任务教程 黑马程序员 第五章 课后答案

    所有章节答案合集-->传送门 [测一测] 学习完前面的内容,下面来动手测一测吧,请思考以下问题: 1.简述什么是会话技术? 2.简述Cookie与Session的区别?(至少写出3点) 3.请设 ...

  8. python从入门到实践答案博客园_《Python从入门到实践》--第八章 函数 课后练习4...

    题目: 8-12 三明治 :编写一个函数,它接受顾客要在三明治中添加的一系列食材.这个函数只有一个形参(它收集函数调用中提供的所有食材),并打印一条消息,对顾客 点的三明治进行概述.调用这个函数三次, ...

  9. python第五章课后编程题答案_Python核心编程-第五章课后习题

    5-1 整形 讲讲 Python 普通整型和长整型的区别 答:在2.7版本基本淡化了区别.真要区分的话,普通整型是32位或者64位,而长整型只与PC内存有关,很大就是了 5-2 运算符 (a) 写一个 ...

  10. python第五章课后题答案超星_MOOC网课章节答案_Python 语言程序设计见面课测试答案...

    [单选,A1型题] 能疏肝.暖肝,治肝寒气滞诸痛的是() [单选,A4型题,A3/A4型题] 男,32岁,进食后上腹饱胀不适,伴返酸.烧心.嗳气.食欲不振,临床诊断为慢性胃炎.该病治疗中不正确的是() ...

最新文章

  1. 移动平台自动化测试:appium(二)
  2. PHP学习笔记-Cookie
  3. C++ 默认参数和占位符
  4. 2022年学Web前端怎么样?还有发展前景吗?
  5. Ubuntu iso下载地址(14、16、18)
  6. Java设计模式之七大结构型模式(附实例和详解)
  7. -lc++ 和 添加 libc++.tbd 居然是等价的
  8. Dialogue and Conversational Agents
  9. win10 笔记本 右下角出现 天气的解决办法
  10. WebRTC系列补充--native音量控制level
  11. “三位一体”新驱动,基因检测行业走向交叉应用
  12. c语言输出n转义字符串,C语言转义字符介绍和示例
  13. JS Turbo空气悬浮鼓风机
  14. 手把手做一个JSP入门程序(九):购物车的基本实现(Servlet)
  15. 【RESTful】REST 与 RESTful 理解与实践
  16. Opencv学习之:如何将矩阵转换成图片,如何将图片转换成矩阵
  17. html5图片本地缓存,HTML5: 本地缓存
  18. BFS团战可以输、提莫必须死(转载)
  19. Realme的Login接入过程记录
  20. CodeForcesRound377 732

热门文章

  1. 鸿蒙和想象部落哪个好些,还是想说说鸿蒙
  2. python 车牌识别训练模型_使用Python基于HyperLPR/Mask-RCNN的中文车牌识别
  3. pc工具不支持stb的加密方式_微信协议分析 pc端记录实现不死号
  4. 向英雄联盟生涯致敬,三十行Python代码爬取LOL官网英雄皮肤图片
  5. asp.net C#后台实现下载文件的几种方法
  6. 由浅入深探究mysql索引结构原理、性能分析与优化
  7. 如何将一个String和多个String值进行比较
  8. Kerio Network Monitor
  9. C# 泛型2---排序
  10. [CLR团队公告]CLR基础研究团队纲领