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. hdu 6006 Engineer Assignment 状压dp

    Engineer Assignment Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Othe ...

  2. 通过java代码往mysql数据库中写入日期相关数据少13个小时

    通过show variables like '%time_zone%'; 查看时区: CST 时区 名为 CST 的时区是一个很混乱的时区,有四种含义: 美国中部时间 Central Standard ...

  3. 'telnet' 不是内部或外部命令,也不是可运行的程序

    1.打开控制面板 2. 3. 4.这样就好可,重新打开cmd命令.

  4. Nginx 常用配置

    Nginx的负载均衡方式 1.轮询(默认) 每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器down掉,能自动剔除. 2.weight 指定轮询几率,weight和访问比率成正比,用于后端 ...

  5. 主成分分析(PCA)原理及R语言实现 | dimension reduction降维

    如果你的职业定位是数据分析师/计算生物学家,那么不懂PCA.t-SNE的原理就说不过去了吧.跑通软件没什么了不起的,网上那么多教程,copy一下就会.关键是要懂其数学原理,理解算法的假设,适合解决什么 ...

  6. CentOS 7下安装GUI图形界面

    https://www.linuxidc.com/Linux/2017-03/141465.htm

  7. 常见程序入口点(OEP)特征

    delphi: 55            PUSH EBP  8BEC          MOV EBP,ESP  83C4 F0       ADD ESP,-10  B8 A86F4B00   ...

  8. Spring框架中获取连接池的几种方式

    什么是数据库连接池? 数据库连接池是一种关键的有限的昂贵的资源,对数据库连接的管理能显著影响到整个应用程序的伸缩性和健壮性,影响到程序的性能指标.数据库连接池就是用来解决这些问题而提出的. 数据库连接 ...

  9. ssh-keygen公钥进行免登

    A服务器地址:192.168.1.200,下面简称A B服务器地址:192.168.1.201,下面简称B 1.在A生成密钥对ssh-keygen -t rsa -P ""1执行上 ...

  10. elasticsearch多字段搜索

    https://blog.csdn.net/Ricky110/article/details/78888711 多字段搜索多字符串查询boost 参数 “最佳” 值,较为简单的方式就是不断试错,比较合 ...