python 游戏 —— 汉诺塔(Hanoita)

一、汉诺塔问题

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) 代码实现

 1 ''' 编程环境:python3.7  win7x64 '''
2 def printf(A,C): #盘子移动的输出格式
3 print("{} --> {}".format(A,C))
4
5 def move(n,A,B,C):
6 if n == 1:
7 printf(A,C) #将最后1个盘子从A座移到C座
8 else:
9 move(n-1,A,C,B) #将n个盘子从A座借助B座移到C座
10 printf(A,C) #将最后1个盘子从A座移到C座
11 move(n-1,B,A,C) #将n个盘子从B座借助A座移到C座
12
13 N = int(input("请输入汉诺塔层数:"))
14 move(N,'A','B','C')

    (2) 有图有真相

2. 可视化解决

  (1) 代码实现

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

  (2) 有图有真相

python 游戏 —— 汉诺塔(Hanoita)的更多相关文章

  1. python递归——汉诺塔

    汉诺塔的传说 法国数学家爱德华·卢卡斯曾编写过一个印度的古老传说:在世界中心贝拿勒斯(在印度北部)的圣庙里,一块黄铜板上插着三根宝石针.印度教的主神梵天在创造世界的时候,在其中一根针上从下到上地穿好了 ...

  2. python解决汉诺塔问题

    今天刚刚在博客园安家,不知道写点什么,前两天刚刚学习完python 所以就用python写了一下汉诺塔算法,感觉还行拿出来分享一下 首先看一下描述: from :http://baike.baidu. ...

  3. 【学习】Python解决汉诺塔问题

    参考文章:http://www.cnblogs.com/dmego/p/5965835.html   一句话:学程序不是目的,理解就好:写代码也不是必然,省事最好:拿也好,查也好,解决问题就好!   ...

  4. Python实现汉诺塔问题的可视化(以动画的形式展示移动过程)

    学习Python已经有一段时间了,也学习了递归的方法,而能够实践该方法的当然就是汉诺塔问题了,但是这次我们不只是要完成对汉诺塔过程的计算,还要通过turtle库来体现汉诺塔中每一层移动的过程. 一.设 ...

  5. python实现汉诺塔程序

    # 汉诺塔思想笔记# 认识汉诺塔的目标:把A柱子上的N个盘子移动到C柱子# 递归的思想就是把这个目标分解成三个子目标# 子目标1:将前n-1个盘子从a移动到b上# 子目标2:将最底下的最后一个盘子从a ...

  6. Python之汉诺塔递归运算

    汉诺塔问题是一个经典的问题.汉诺塔(Hanoi Tower),又称河内塔,源于印度一个古老传说.大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘.大梵天命令婆 ...

  7. python 实现汉诺塔

    汉诺塔:汉诺塔(又称河内塔)问题是源于印度一个古老传说的益智玩具.大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘. 大梵天命令婆罗门把圆盘从下面开始按大小顺 ...

  8. python实现汉诺塔

    经典递归算法汉诺塔分析: 当A柱子只有1个盘子,直接A --> C 当A柱子上有3个盘子,A上第一个盘子 --> B, A上最后一个盘子 --> C, B上所有盘子(1个) --&g ...

  9. python实现汉诺塔移动

    汉诺塔问题 汉诺塔是根据一个传说形成的一个问题.汉诺塔(又称河内塔)问题是源于印度一个古老传说的益智玩具.大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘.大 ...

随机推荐

  1. 学习笔记74—函数argsort()

    ****************************************************** 如有谬误,请联系指正.转载请注明出处. 联系方式: e-mail: heyi9069@gm ...

  2. git 执行pull错误如何撤销

    比如你当前所在的空间是trunk,但是执行了git pull origin branches,这时需要回滚回去,可以用一下步骤: 1.运行git reflog命令查看你的历史变更记录,如下: 69fd ...

  3. linux 内存-文档学习

    ptmalloc http://www.malloc.de/en/ tcmalloc https://github.com/gperftools/gperftools jcmalloc http:// ...

  4. [大数据面试题]storm核心知识点

    1.storm基本架构 storm的主从分别为Nimbus.Supervisor,工作进程为Worker. 2.计算模型 Storm的计算模型分为Spout和Bolt,Spout作为管口.Bolt作为 ...

  5. charles\mitmproxy\appium的安装与使用

    一.charles安装与激活1.https://www.charlesproxy.com/documentation/installation/下载dmg包安装后要将应用添加到Mac的应用目录中,一般 ...

  6. python -- 返回函数、匿名函数、装饰器

    返回函数 高阶函数的参数可以是函数,那么其返回值也可以是函数. 闭包 对于高阶函数,内部函数可以引用外部函数的参数和局部变量.当调用外部函数返回内部函数时,相关参数和变量都保存在返回的函数(即内部函数 ...

  7. CF 552(div 3) E Two Teams 线段树,模拟链表

    题目链接:http://codeforces.com/contest/1154/problem/E 题意:两个人轮流取最大值与旁边k个数,问最后这所有的数分别被谁给取走了 分析:看这道题一点思路都没有 ...

  8. 【XAF问题】多个属性验证RuleUniqueValue

    一.问题 1. 在XAF中如何验证多个属性唯一值? 二.解决方法 使用RuleCombinationOfPropertiesIsUnique [RuleCombinationOfPropertiesI ...

  9. php实现ZIP压缩文件解压缩

    测试使用了两个办法都可以实现: 第一个:需要开启配置php_aip.dll <?php //需开启配置 php_zip.dll //phpinfo(); header("Content ...

  10. webstrom

    1.webstrom如何在左边显示多个工程 File-> Settings -> Directories -> Add Content Root,选择你要加入的Project 点击O ...