汉诺塔完整代码及分析
问题描述:
汉诺塔游戏,现在有ABC三根柱。要求:将A柱所有的圆盘放到C柱。在移动的过程中可以借助B柱。并且规定大圆盘不能放小圆盘上,每次只能移动一个盘子。用递归的方式来解决汉诺塔问题。
解题思路:
- 假定最上面是第一层为1号圆盘,简称1号,最下面一层最大第n层为n号圆盘,简称n号
- 需要先将n-1层按规则移到B柱,即B柱从上到下为 1号、2号、… 、n-1号,C柱空出,A柱只剩下最大的n号一个
- 然后A柱的第n层n号,移到C柱上,再将B柱的1——n-1号按规则,移到C上,完成移动
- 当只有1层时,将A柱1号,移到C柱,完成
- 当只有2层时,先将A柱1号,移到B柱,A柱2号移到C柱,然后,将B柱1号移到C柱,完成
- 当只有3层时,先将A柱1号,移到C柱,A柱2号移到B柱,然后,将C柱1号移到B柱,这样就将n-1层全部移动了B柱,A柱只剩下n号(即3号),C柱空出。
- 当有4层时,将前3层称到B注,把C柱空出来,即将1号称到B柱,直到n-1层全部移到B柱。
- 如此循环搬运即可完成n层汉诺塔移动。
- 由此可以推导出两个结论:
- n层汉诺塔至少需要移动 (2^n) -1 次
- 1层 需要 1次 (2^1)-1
- 2层 需要 3次 (2^2)-1
- 3层 需要 7次 (2^3)-1
- 4层 需要 15次 (2^4)-1
- 5层 需要 31次 (2^5)-1
- …
- 奇数层:最上面一层1号最先移动到C柱,可确保 n-1 层全部移到B柱;偶数层:最上面一层1号,最先移动到B柱,可确保 n-1 层全部移到B柱
- 完整代码如下: (如果转载,标明来源,谢谢!)
count1 = 0 # 计数器def move(num1, a, b, c):a_key = list(a.keys())[0]b_key = list(b.keys())[0]c_key = list(c.keys())[0]a2 = a[a_key].pop(-1)c[c_key].append(a2)l1 = sorted([a_key + " : " + "、".join(a[a_key]), b_key + " : " + "、".join(b[b_key]), c_key + " : " + "、".join(c[c_key])])str0 = f"*******第{num1}次搬动:将 {a_key} 圆盘{a2} 搬到 {c_key} \n 搬动后:{l1[0]}\n{' '*10+l1[1]}\n{' '*10+l1[2]}"return str0def huanruota(level, a, b, c):global count1if level == 1:count1 += 1print(move(count1, a, b, c))else:huanruota(level - 1, a, c, b)count1 += 1print(move(count1, a, b, c))huanruota(level - 1, b, a, c)def main():while True:print("需要输入汉诺塔的层数数字,如9层,输入数字9,输入q表示放弃即既退出")level_str = input("请输入数字(1-9)或 q :").strip()if level_str not in "123456789qQ" or len(level_str) > 1:print("请输入正确的数字,层数过大,系统会崩溃的!!!\n")continueelif level_str == "q" or level_str == "Q" or level_str == "":breaklevel = int(level_str)list1 = []for i in range(level, 0, -1):list1.append(str(i))print("初始状态:A柱:" + "、".join(list1) + "\n" + " " * 10 + "B柱" + "\n" + " " * 10 + "C柱")huanruota(level, {"A柱": list1}, {"B柱": []}, {"C柱": []})print(f"☺☺☺ 已按要求完成{level}层汉诺塔从A柱将所有的圆盘放到C柱 ☺☺☺\n")global count1count1 = 0if __name__ == "__main__":main()
运行结果显示:
如有不详尽地方或改进地方,欢迎留言讨论。
汉诺塔完整代码及分析相关推荐
- 递归-汉诺塔(代码、分析、汇编)
代码: #include <stdio.h>void hanoi(int n, char a, char b, char c) {if( n > 0 ){if( n == 1 ){p ...
- python3简单代码_python3实现简单汉诺塔的代码教程
python3实现简单汉诺塔的代码教程 #!/usr/bin/env python3 #_*_*_ coding: utf-8 _*_*_ #汉诺塔 # def hannuota(n,N,M): # ...
- 汉诺塔python代码解释_Python-汉诺塔原理分析
最近在"廖雪峰的官方网站"学习Python,遇到汉诺塔递归问题百思不得其解,先是百度了汉诺塔原理,然后查看了别人的写的文章,通过整理汇总,希望能够帮助其他人理解. 汉诺塔原理:(来 ...
- 汉诺塔python代码解释_python实现汉诺塔算法
题目: 汉诺塔给出最优解,如果对汉诺塔的定义有不了解,请翻看数据结构教材. 除了最基本的之外,还有一题,给定一个数组,arr=[2,3,1,2,3],其含义是这是一个有5个圆盘的汉诺塔,每一个数字代表 ...
- 汉诺塔递归问题的分析与Python实现
背景 相传在古印度圣庙中,有一种被称为汉诺塔(Hanoi)的游戏.该游戏是在一块铜板装置上,有三根杆(编号A.B.C),在A杆自下而上.由大到小按顺序放置64个金盘(如图).游戏的目标:把A杆上的金盘 ...
- 个盘子的汉诺塔需要移动几步_坨——理解递归实现quot;汉诺塔quot;代码的关键...
我记得,大学学C语言时,在函数递归调用那一节有个作业,就是写汉诺塔.不少同学遭遇到困难.在知乎上遇见的就有: 如何理解汉诺塔的递归?www.zhihu.com 题主发出悲鸣:"--学C++ ...
- 汉诺塔——老夫不管什么分析不分析,直接粗暴
直接上图开干: 1个盘子直接从A放到C(递归出口),大于1个不管你有多少盘子,我始终把你当成两个盘子,即第n个和第(n-1)个,那就是把(n-1)放到B,把n放到C,再把(n-1)放到C,递归思想大功 ...
- c语言程序代码应缩进几格,汉诺塔c语言程序代码
汉诺塔c语言程序代码(通过vc++6.0验证)(附讲解) 让我们先看看代码吧 #include int hj(int a,int b, int c,int i) { int t; if(i==1) p ...
- 汉诺塔代码执行的流程图
汉诺塔是递归中的经典问题,很多人虽然懂得如何写汉诺塔的代码,但是并不能够完整地明白汉诺塔代码的调用逻辑.作者花了点时间,画了一张流程图,希望能够帮大家理解. 先上代码: #include"s ...
最新文章
- 区块链BaaS云服务(34)新加坡艾达链ASC
- leetcode 520. 检测大写字母(Java版)
- 代码规范利器-阿里代码规范插件
- JS验证邮箱格式、信用码、税号和注册号
- 计算机视觉————理解彩色图片
- 为知笔记打不开 ziw 文件问题
- java 移动短代支付_运营商支付/短代支付的市场前景如何?
- UEFI学习(一)-EDK II环境搭建
- 如何减小电压跟随器输出电阻_逐次比较式模数转换器如何获取最佳采样频率
- 如何解决Excel文档已损坏呢?
- Scrapy抓站:大批量下载360指定专题下的照片并保存到sql和本地文件夹下
- node下载(使用nvm的方式)
- 春招大盘点:找工作除了招聘网站还有哪些渠道?
- Python+Appium+夜神模拟器 全流程从环境搭建到实现自动化(APP自动化)
- 站长工具大全,站长工具哪个好用,站长在线工具
- [安卓刷机实战]小米/红米手机刷机降系统图文教程-解锁小米手机-K30 5G版[开箱可用][解锁+刷机全步骤教程]
- 目标检测AP、mAP计算方法
- 面具卡米怎么删模块_面具magisk ROOT如何更新到最新版本两种实用方法彻底解决...
- 常州买衣服(优先队列)
- 生物学丨PsbA丨D1 protein of PSII应用实例
热门文章
- Java研发小试(面试题)
- 计算机更新后打印机无法使用,Win10升级后惠普打印机无法打印的解决方法
- python高级算法与数据结构:“你如何压缩一部英文著作”,一道来自大厂的真实面试题
- 2014.华为实习招聘数字芯片(转)
- jdk17下载与安装教程(win10),超详细
- python 词语频率统计_计算词和词组频率的Python nltk
- drv8833 马达控制
- c++ 调用opencv+tesseract做图片文字识别
- 笔记之 02_传智播客AJAX视频教程_使用IntelliJ开发Web项目
- 如何根据选股条件选择基本面量化股票池?