python汉诺塔问题输入层数输出整个移动流程_python 实现汉诺塔游戏
一、汉诺塔问题
1. 问题来源
问题源于印度的一个古老传说,大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘。大梵天命令婆罗门把圆盘从下面开始按大小顺序重新摆放在另一根柱子上。并且规定,在小圆盘上不能放大圆盘,在三根柱子之间一次只能移动一个圆盘。
2. 问题阐述
塔内有三个座A、B、C,A座上有64个盘子,盘子从上到下逐渐变大,最下面的盘子最大。目前要把A座的64个盘子从A座移到C座,并且每次只能移动一个盘子,移动过程中三个座保持大盘子在下,小盘子在上,要求输出盘子的移动过程。
二、问题解析
1. 解决方法:递归方法
2. 解题过程
(1) 将上面63个盘子从A座移到B座
(2) 将最下面的盘子从A座移到C座
(3) 将B座的63个盘子从B座移到C座
三、问题解决
1. 非可视化解决
(1) 代码实现
''' 编程环境:python3.7 win7x64 '''
def printf(A,C): #盘子移动的输出格式
print("{} --> {}".format(A,C))
def move(n,A,B,C):
if n == 1:
printf(A,C) #将最后1个盘子从A座移到C座
else:
move(n-1,A,C,B) #将n个盘子从A座借助B座移到C座
printf(A,C) #将最后1个盘子从A座移到C座
move(n-1,B,A,C) #将n个盘子从B座借助A座移到C座
N = int(input("请输入汉诺塔层数:"))
move(N,'A','B','C')
(2) 有图有真相
2. 可视化解决
(1) 代码实现
''' 编程环境:python3.7 win7x64 '''
from turtle import *
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_1(k):#画汉诺塔的底座
up()
pensize(10)
speed(100)
goto(400*(k-1), 100)
down()
goto(400*(k-1), -100)
goto(400*(k-1)-20, -100)
goto(400*(k-1)+20, -100)
def drawpole_3():#画出汉诺塔的三个底座
hideturtle()#隐藏
drawpole_1(0)#画出汉诺塔的底座左
drawpole_1(1)#画出汉诺塔的底座中
drawpole_1(2)#画出汉诺塔的底座右
def creat_plates(n):#制造n个盘子
plates=[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=[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=Screen()
setup(1200,500) #设置窗口大小
drawpole_3() #画汉诺塔的底座
n=int(input("请输入汉诺塔的层数并回车:"))#输入汉诺塔的盘子数
plates=creat_plates(n)#制造n个盘子
poles=pole_stack()
for i in range(n):
poles[0].push(i)
moveTower(plates,poles,n,0,2,1)
myscreen.exitonclick()
(2) 有图有真相
以上就是python 实现汉诺塔游戏的详细内容,更多关于python 汉诺塔游戏的资料请关注我们其它相关文章!
本文标题: python 实现汉诺塔游戏
本文地址: http://www.cppcns.com/jiaoben/python/366514.html
python汉诺塔问题输入层数输出整个移动流程_python 实现汉诺塔游戏相关推荐
- python汉诺塔问题输入层数输出整个移动流程_python实现汉诺塔方法汇总
学习python遇到的第一个问题:汉诺塔问题的实现.首先是不知道什么是汉诺塔问题,然后是不知道怎么实现.于是百度了下,结果如下: 汉诺塔:汉诺塔(又称河内塔)问题是源于印度一个古老传说的益智玩具.大梵 ...
- python中output使用_python-02.输入Input/输出Output
输出 用print()在括号中加上字符串,就可以向屏幕上输出指定的文字.比如输出'hello, world',用代码实现如下: >>> print('hello, world') p ...
- python常用语法和示例_使用Python中的示例进行输入和输出操作
python常用语法和示例 A Program needs to interact with the user to accomplish the desired task; this is done ...
- Python编程基础04:输入与输出
文章目录 一.IPO模型 二.基本输入 - input()函数 1.函数格式 2.参数说明 3.实例演示 (1)接收字符串数据 (2)接收整型数据 (3)接收浮点型数据 (4)容易出现的错误 三.基本 ...
- python输入生日输出星座代码 过程_python字典保存星座性格特点并输出
#创建一个文件,在该文件中创建两个字典,一个保存名字和星座,另一个保存星座和性格特点, #最后从这两个字典取出相应的信息组合成想要的结果: name = ['绮梦','冷伊一','香凝','黛兰'] ...
- 在Python中以二进制格式输入数字
Syntax to convert binary value to an integer (decimal format), 将二进制值转换为整数(十进制格式)的语法, int(bin_value, ...
- python中八进制_在Python中以八进制格式输入数字
python中八进制 Syntax to convert octal value to an integer (decimal format), 将八进制值转换为整数(十进制格式)的语法, int(o ...
- python 读取文件到字典读取顺序_python_实现dictionary按照输入顺序输出
背景: 需要读取一个csv文件,并将其数据保存在dictionary中,并按照读文件的顺序输出,且不能引用第三方包,只能使用python自带模块.输出格式如下: 在使用python的dictionar ...
- Python 输入和输出
输出 用print加上字符串,就可以向屏幕上输出指定的文字.比如输出'hello, world',用代码实现如下: >>> print 'hello, world' print语句也 ...
最新文章
- 2013上半年-学习目录
- 顺序容器----顺序容器概述,容器库概览
- java textfield事件_[求助]TextField失去焦点触发事件问题
- 服务器未进系统如何关机,云服务器关机了怎么开机
- OA,ERP等源码一部分演示
- java开发引擎_【java规则引擎】java规则引擎搭建开发环境
- hadoop--hadoop集群常用脚本
- CSPNet论文笔记
- LaTeX 阿拉伯语
- HTML5 标签大全
- java queue GATK_GATK使用注意事项
- Windows Server 2012R2 虚拟专用网络技术
- Github+Jekyll —— 创建个人免费博客(四)jekyll第一个页面
- [Java GC]Java垃圾回收
- Project-Euler-045思维
- Exchange 2010 Ps 之使用更新脱机地址簿系列命令get-offlineaddressbookUpdate-offlineaddressbook
- Java实现本机IP的修改和获取
- 算一下你来到这个世界多少天?
- GTOT和RGBT234测评工具箱使用
- python常用的数字类型方法_python基础--数据类型的常用方法1
热门文章
- 用VBscrip的while循环计算4096是2的几次方,这样做对吗
- bzoj 3252: 攻略
- 关于AMS(艾迈斯)的VOC传感器iAQ-Core的使用笔记
- 惠普之路——HP公司发展史
- 百度的Js日历,值得一看
- java毕业设计房屋中介管理Mybatis+系统+数据库+调试部署
- 十二、Redis LRU算法详述(Least Recently Used - 最近最少使用)
- 雨林木风Ghostxp sp3五周年纪念版(精品)
- NetBIOS特性简介
- 如何做一个听话的 “输入框”--摘抄