基于非递归算法的汉诺塔游戏之Python实现
本文代码涉及到汉诺塔问题的非递归算法,可能不是很好理解,我在代码中加了大量注释,希望能够有所帮助,如果实在难以理解的话,请搜索这个算法并结合下面的代码进行阅读和理解。感谢国防科技大学刘万伟老师提供算法思路和第一版本的代码。
def hannoi(n):
#用来记录移动过程中每个盘子的当前位置
#初始都在A柱子上,即chr(65+0)
L = [0] * n
#n个盘子一共需要移动2^n-1次才能完成
for i in range(1, 2**n):
#假设盘子编号分别为0,1,2,...,n-1
#第i步应该移动的盘子编号
#正好是i的二进制形式中最后连续的0的个数
b_i = bin(i)
j = len(b_i) - b_i.rfind('1') - 1
print('第'+str(i)+'步:移动盘子'+str(j+1),
chr(65+L[j]),'->', end=' ')
#把ABC三根柱子摆成三角形
#把第j个盘子移动到下一根柱子上
#根据j的奇偶性决定是顺时针移动还是逆时针移动
L[j] = ((L[j]+1)%3 if j%2 == 0 else (L[j]+2)%3)
#下一根柱子,这里65是A的ASCII码
print(chr(65+L[j]))
hannoi(3)
运行结果为:
第1步:移动盘子1 A -> B
第2步:移动盘子2 A -> C
第3步:移动盘子1 B -> C
第4步:移动盘子3 A -> B
第5步:移动盘子1 C -> A
第6步:移动盘子2 C -> B
第7步:移动盘子1 A -> B
基于非递归算法的汉诺塔游戏之Python实现相关推荐
- C++非递归解决汉诺塔问题
汉诺塔问题简述:将塔A上的n个大小不一的盘子借由塔B全部移动到塔C上,且在过程中不能将大盘子放在小盘子上. 目录 1.算法: 2.具体效果: 3.SeqStack.c ...
- python堆栈汉诺塔非递归_汉诺塔问题的递归解法和非递归解法(python语言实现)...
汉诺塔问题的非递归解法(python语言类解法) #!/usr/bin/env python #coding:utf-8 import sys import time reload(sys) sys. ...
- 数据结构之递归算法解决汉诺塔问题
汉诺塔(Tower of Hanoi),又称河内塔,是一个源于印度古老传说的益智玩具.大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘.大梵天命令婆罗门把圆盘 ...
- C语言编程求解圆盘的汉诺塔,课内资源 - 基于80x86汇编的汉诺塔
一.软件背景介绍 我们今天要陈述的应用叫做汉诺塔,大家可能小时候都接触过类似于鲁班锁,九连环的益智玩具,我们要说的汉诺塔其实也可以说是益智玩具的一种. 下面我们具体介绍一下汉诺塔.汉诺塔有三根杆子A, ...
- 用递归与非递归方法实现汉诺塔问题,C语言实现
如题,直接上代码,注释写的很全了 非递归还是用栈实现 /*包含头文件*/ #include <stdio.h> #define MAXSIZE 60 /*函数声明*/ void Hanoi ...
- 递归算法之汉诺塔问题
问题叙述 故事背景: 法国数学家爱德华·卢卡斯曾编写过一个印度的古老传说:在世界中心贝拿勒斯(在印度北部)的圣庙里,一块黄铜板上插着三根宝石针.印度教的主神梵天在创造世界的时候,在其中一根针上从下到上 ...
- 递归算法之汉诺塔的实现
一个印度的古老传说:在世界中心贝拿勒斯(在印度北部)的圣庙里,一块黄铜板上插着三根宝石针.印度教的主神梵天在创造世界的时候,在其中一根针上从下到上地穿好了由大到小的64片金片,这就是所谓的汉诺塔.不论 ...
- 算法与程序设计递归算法理解——汉诺塔
目录 1.理解汉诺塔问题可以先从下面两点入手 2.列出一到四层汉诺塔移动顺序寻找规律 3.将移动顺序用树状图来表示 4.将树状图转化为程序实现 1.理解汉诺塔问题可以先从下面两点入手 根据汉诺塔移动规 ...
- 递归算法 —— Hanoi汉诺塔游戏
前言 博客主页:干脆面la的主页 gitte链接:干脆面la的gitee仓库 刚学习完递归函数接触汉诺塔问题的时候,汉诺塔问题困扰了我很久.博主花了很长时间理解这道题目,因此整理出了用递归解决汉诺塔问 ...
最新文章
- 手把手教你用Prophet快速进行时间序列预测(附Prophet和R代码)
- 要命的定义函数。。。参数组合。请认真理解!
- ArcGIS 复制要素
- Python Django 可变参数*与**的区别
- 每天定时查询CSDN博客访问量,并通过echarts进行展示
- WSL2 安装中文输入法教程 简单有效
- 云计算的发展趋势_2020年的云计算发展趋势预测
- Windows GUI代码与Windows消息问题调试利器
- 小汤学编程之JavaScript学习day03——对象、Array数组、String字符、Date日期、JSON
- 响应式布局技术:App如何适配不同尺寸的设备
- TrackBack 技术规范
- Spark技术内幕:Master基于ZooKeeper的High Availability(HA)源代码实现
- win10 3dmax 激活后反复激活和激活码无效问题
- 情人节--我们依旧单身(制作属于自己的QQ拼音皮肤)(带全部ps素材)
- 使用MongoVUE
- 同志社交Blued赴美上市背后的三个问号
- 测量中的坐标与时间系统1.2(在大地测量学中)
- Debian11更换阿里源
- MYSQL基础教程书籍
- 看清有关 SDN 的七大认识偏差
热门文章
- 如何制作linux系统硬盘,手把手带你自制Linux系统之二 简易Linux的制作
- java httpost阻塞_httpclient发送get请求阻塞?
- 压缩包安装_SPSS 21 下载(内附压缩包及安装过程)
- php7.0 freetype_php7.0.5安装教程
- Linux 环境下FC(SAN)磁盘在线删除
- js 判断字符串为空的方法
- 基于JAVA+SpringBoot+Mybatis+MYSQL的文档管理系统
- java 窗口鼠标句柄_c#获取窗体句柄模拟鼠标点击
- 新手使用struts2,记一次struts2启动出错
- Mobile Phone Network CodeForces - 1023F(并查集lca+修改环)