Python入门习题(91)——OpenJudge百练习题:汉诺塔问题

2023-11-17

OpenJudge百练第4147号习题:汉诺塔问题

题目描述

来源
OpenJudge网站 —— 百练习题集-第4147号习题

要求
总时间限制: 1000ms 内存限制: 65536kB

描述

一、汉诺塔问题

有三根杆子A,B,C。A杆上有N个(N>1)穿孔圆盘,盘的尺寸由下到上依次变小。要求按下列规则将所有圆盘移至C杆: 每次只能移动一个圆盘; 大盘不能叠在小盘上面。 提示:可将圆盘临时置于B杆,也可将从A杆移出的圆盘重新移回A杆,但都必须遵循上述两条规则。

问:如何移?最少要移动多少次?

汉诺塔示意图如下:

在这里插入图片描述

三个盘的移动:

在这里插入图片描述

二、故事由来

法国数学家爱德华·卢卡斯曾编写过一个印度的古老传说:在世界中心贝拿勒斯(在印度北部)的圣庙里,一块黄铜板上插着三根宝石针。印度教的主神梵天在创造世界的时候,在其中一根针上从下到上地穿好了由大到小的64片金片,这就是所谓的汉诺塔。不论白天黑夜,总有一个僧侣在按照下面的法则移动这些金片:一次只移动一片,不管在哪根针上,小片必须在大片上面。僧侣们预言,当所有的金片都从梵天穿好的那根针上移到另外一根针上时,世界就将在一声霹雳中消灭,而梵塔、庙宇和众生也都将同归于尽。

不管这个传说的可信度有多大,如果考虑一下把64片金片,由一根针上移到另一根针上,并且始终保持上小下大的顺序。这需要多少次移动呢?这里需要递归的方法。假设有n片,移动次数是f(n).显然f(1)=1,f(2)=3,f(3)=7,且f(k+1)=2*f(k)+1。此后不难证明f(n)=2^n-1。n=64时, 假如每秒钟一次,共需多长时间呢?一个平年365天有31536000 秒,闰年366天有31622400秒,平均每年31556952秒,计算一下: 18446744073709551615秒 这表明移完这些金片需要5845.54亿年以上,而地球存在至今不过45亿年,太阳系的预期寿命据说也就是数百亿年。真的过了5845.54亿年,不说太阳系和银河系,至少地球上的一切生命,连同梵塔、庙宇等,都早已经灰飞烟灭。

三、解法

解法的基本思想是递归。假设有A、B、C三个塔,A塔有N块盘,目标是把这些盘全部移到C塔。那么先把A塔顶部的N-1块盘移动到B塔,再把A塔剩下的大盘移到C,最后把B塔的N-1块盘移到C。 每次移动多于一块盘时,则再次使用上述算法来移动。

输入
输入为一个整数后面跟三个单字符字符串。
整数为盘子的数目,后三个字符表示三个杆子的编号。
输出
输出每一步移动盘子的记录。一次移动一行。
每次移动的记录为例如3:a->b 的形式,即把编号为3的盘子从a杆移至b杆。
我们约定圆盘从小到大编号为1, 2, …n。即最上面那个最小的圆盘编号为1,最下面最大的圆盘编号为n。
样例输入
3 a b c
样例输出
1:a->c
2:a->b
1:c->b
3:a->c
1:b->a
2:b->c
1:a->c
提示
加粗样式可参考如下网址:
http://blog.csdn.net/geekwangminli/article/details/7981570
http://www.cnblogs.com/yanlingyin/archive/2011/11/14/2247594.html
原来源
重庆科技学院 WJQ

解题思路

  1. 我们把问题进行抽象,概括为:把1号到n号盘从start柱子移到end柱子,移动步骤是什么?用函数move(n, start, end)来封装上述问题的求解过程。
  2. 假设n是盘子总数,柱子是a, b, c,则有:
    (1) move(n, a, c) = move(n-1, a, b) + n:a->c + move(n-1, b, c) 。n:a->c指的是把n号盘从a柱子移动到c柱子;这里的加号+指的是执行过程的拼接。
    (2)move(n-1, a, b) = move(n-2, a, c) + n-1:a->b + move(n-2, c, b)
    我们可以继续展开求解move(n-2, a, c)或move(n-2, c, b)的过程。相信你已经找出规律。
  3. 函数move(n, start, end)是一个递归函数。在函数内部,先求出过渡用的中介柱子by,接着落实“move(n, start, end) = move(n-1, start, by) + n:a->c + move(n-1, by, end) ”即达成目的。
  4. 递归函数move的终止条件是n=1。

参考答案

n, a, b, c = input().split()
n = int(n)
abc = set([a, b, c])

#把1号到n号盘从start柱子移到end柱子,输出移动轨迹
def move(n, start, end):
    if n == 1:
        print("%d:%s->%s"%(n, start, end))
        return
	# move(n, a, c) = move(n-1, a, b) + n:a->c + move(n-1, b, c)
    s_e = set([start, end])
    by = list(abc - s_e)[0]
    move(n-1, start, by)
    print("%d:%s->%s"%(n, start, end))
    move(n-1, by, end)

move(n, a, c)

测试用例

  1. 题目描述给出的测试用例覆盖了一般情形。
  2. n=1的边界情形。
    样例输入
    1 r s t
    样例输出
    1:r->t
  3. n=2
    样例输入
    2 a b c
    样例输出
    2:a->b
    1:a->c
    2:b->c

小结

  1. 运用递归,一个看起来复杂的问题可能变得异常简单。汉诺塔问题就是一例。
  2. 关键点是发现递归规律。也要注意递归终止条件。
  3. 尽管题目要求把n张盘从a柱子移到c柱子,但不能把问题概括为move(n, a, c),而应该概括为move(n, start, end)。原因是,出发柱子和到达柱子是不固定的。例如:move(n, a, c) = move(n-1, a, b) + n:a->c + move(n-1, b, c)。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Python入门习题(91)——OpenJudge百练习题:汉诺塔问题 的相关文章

  • Ptython入门学习:模块导入自定义函数与 时间模块练习

    目录 Python 日期和时间 Python 第三方模块 Python 日期和时间 Python 的 time 模块下有很多函数可以转换常见日期格式 如函数time time 用于获取当前时间戳 import time import dat
  • 零基础如何快速入门学python?python全套学习路线总结

    前言 学习任何一门语言都是从入门 1年左右 通过不间断练习达到熟练水准 3到5年 少数人最终能精通语言 成为执牛耳者 他们是金字塔的最顶层 虽然万事开头难 但好的开始是成功的一半 今天这篇文章就来谈谈如何开始入门Python 只要方向对了
  • 用Tensorflow Agents实现强化学习DQN

    在我之前的博客中强化学习笔记 4 深度Q学习 gzroy的博客 CSDN博客 实现了用Tensorflow keras搭建DQN模型 解决小车上山问题 在代码里面 需要自己实现经验回放 采样等过程 比较繁琐 Tensorflow里面有一个a
  • 作为程序员,赚取额外收入的 4个简单副业!

    对于程序员来说 可不是只有赚死工资这一条道路 好学编程给大家总结一下有哪些兼职渠道 以供大家参考 1 知识变现 一些问答平台比如微博 知乎 悟空问答 芝麻问答 饭团 知识星球 付费QQ群 付费社群等等 我们都可以挑选自己专业领域的问题选择回
  • Python做数据分析需要学什么?

    下面分别从这四个方面来带大家学习数据分析 第一 做数据分析要精通Python吗 第二 数据分析流程是什么 学什么 第三 如何培养数据分析思维 第四 数据分析书籍推荐 一 数据分析要精通Python吗 做数据分析不必精通Python 但至少要
  • 基于Tensorflow来重现GPT v1模型

    OpenAI推出的ChatGPT模型让我们看到了通用人工智能的发展潜力 我也找了GPT的相关论文来进行研究 OpenAI在2017年的论文Improving Language Understanding by Generative Pre
  • Numpy实现矩阵转置的几种方法

    在矩阵操作中 经常需要对矩阵进行转置 或者需要交换矩阵的轴 下面介绍一下使用Numpy完成矩阵轴数据交换的几种方法 主要包括以下几种方法 1 T转置 适用于1 D 2 D矩阵 2 np transpose 适用于一次同时交换多个 大于两个
  • Python真的能杀死Excel吗?它能实现哪些Excel功能?

    在大家的印象里 想进入金融行业或者数据岗位 首先需要精通Excel 而且现在招聘条件也是明确表示 要精通Excel等办公软件 后面还会加一句 有Python经验的优先 野村证券副首席数字官马修 汉普森在上周五的伦敦Quant Confere
  • python数据分析实例:利用爬虫获取数据

    我们在工作中用到网络上发布的各种信息 如果用搜索引擎查找并整理 需要花费大量时间 现在python能够帮助我们 使用爬虫技术 提高数据查找和整理的效率 我们来找一个爬虫的案例 抓取求职招聘类网站中的数据 使用环境 win10 python3
  • Python3 迭代器与生成器

    迭代器 迭代是Python最强大的功能之一 是访问集合元素的一种方式 迭代器是一个可以记住遍历的位置的对象 迭代器对象从集合的第一个元素开始访问 直到所有的元素被访问完结束 迭代器只能往前不会后退 迭代器有两个基本的方法 iter 和 ne
  • 【源码可分享】教你用Python制作自动答题脚本,实现自动答题,100%正确率!

    文章目录 前言 一 自动答题的原理 二 自动答题的步骤 三 Python实现自动答题的方法 总结 前言 当今社会 人们的生活越来越依赖于计算机技术 而Python作为一种高级编程语言 已经成为了众多程序员的首选语言 Python具有简单易学
  • 用Python做兼职是如何挣钱的?

    我当时学习python大概有半年的时间 学的还可以 后面一个认识的朋友给我介绍了一点私活 当时接单赚了2K左右 后又自己接过开发网站后台接口 做数据处理等事情 七七八八的加起来也有一些收入 其实我学python也是凑巧 我本身是学电商的 后
  • python编程基础-task5-面向对象的编程

    一 类的例子 class Song object class表示要创建类 Song是类的名称 def init self lyrics self lyrics lyrics 这里是设置了lyrics是的全局变量 后面的类里都可以使用这个参数
  • 基于pytorch实现的Auto-encoder模型

    最近因为在自己论文当中可能要用到Auto encoder 这个东西 学了点皮毛之后想着先按照别人的解释实现一下 然后在MNIST数据集上跑了下测试看看效果 话不多说直接贴代码 Author Media 2020 10 23 import t
  • 斐波那契数列计算 Python编程

    问题描述 斐波那契数列如下 F 0 0 F 1 1 F n F n 1 F n 2 编写一个计算斐波那契数列的函数 采用递归方式 输出不超过n的所有斐波那契数列元素 调用上述函数 完成如下功能 用户输入一个整数n 输出所有不超过n的斐波那契
  • Python目前建议最好安装什么版本的?

    Python2 7及以前的版本 已经被淘汰了 图片来源 Python1 1 1 6下载地址 https www python org download releases 在Python1 5 2版本之前 Python官网只提供源代码的下载
  • Python爬虫之入门保姆级教程,学不会我去你家刷厕所

    今天这个教程采用最简单的爬虫方法 适合小白新手入门 代码不复杂 文章目录 今天这个教程采用最简单的爬虫方法 适合小白新手入门 代码不复杂 首先打开咋们的网站 一 导入相关库 requests库 二 相关的参数 url headers 三 向
  • sklearn中cross_val_score、cross_val_predict的用法比较

    交叉验证的概念 直接粘贴scikit learn官网的定义 scikit learn中计算交叉验证的函数 cross val score 得到K折验证中每一折的得分 K个得分取平均值就是模型的平均性能 cross val predict 得
  • Python 配置文件(.ini、 .conf、 .cfg)的读写

    python读取配置文件两个常用模块 ConfigParser和configobj模块 1 对比 ConfigParser的一些问题 不能区分大小写 重新写入的配置文件不能保留原有配置文件的注释 重新写入的配置文件不能保持原有的顺序 不支持
  • Python进行大数据挖掘和分析

    大数据无处不在 在时下这个年代 不管你喜欢与否 在运营一个成功的商业的过程中都有可能会遇到它 什么是大数据 大数据就像它看起来那样 有大量的数据 单独而言 你能从单一的数据获取的洞见穷其有限 但是结合复杂数学模型以及强大计算能力的TB级数据

随机推荐

  • 扛住阿里双十一高并发流量,Sentinel是怎么做到的?

    Sentinel 承接了阿里巴巴近 10 年的双十一大促流量的核心场景 本文介绍阿里开源限流熔断方案 Sentinel 功能 原理 架构 快速入门以及相关框架比较 基本介绍 1 名词解释 服务限流 当系统资源不够 不足以应对大量请求 对系统
  • # winform实现一个服务端和多个客户端进行通信

    参看此链接 http www cnblogs com longwu archive 2011 08 25 2153636 html 在上述代码的基础上进行了修改 包括一些捕获异常以及按钮的应用 扩充了一个listbox确保服务端可以选择和不
  • linux echo输出转义换行回车引号

    echo 输出引号的正确格式 echo 123 echo 123 echo 输出回车换行 制表符的正确格式 echo e n123 echo e n123 echo e t123 echo e t123 输出结果
  • springboot使用pagehelper进行分页

    上次的博客项目 使用到了分页 这里总结一下 1 项目环境 IDE IDEA 语言 java 框架 springboot 模板引擎 thymeleaf 2 效果 3 pom xml
  • 贪吃蛇视频教程

    http gameinstitute qq com lore catalog 10017
  • nvm切换node版本

    nvm是一个node的版本管理工具 可以简单操作node版本的切换 安装 查看等等 与npm不同的是 npm是依赖包的管理工具 nvm 主要为了解决 node js 各种版本存在不兼容现象 1 下载 可去github上下载相关版本 链接地址
  • cmd命令解密Bitlocker

    解锁 manage bde unlock C Recovery 加锁 manage bde lock C 解密 manage bde off C 加密 manage bde on C C表示解锁的盘符 解密需要一定时间 可以用manage
  • 利用python拼接图片代码_Python实现图片拼接的代码

    具体代码如下所示 import os from PIL import Image UNIT SIZE 220 the size of image save path root group dia zxb Code lip CycleGAN
  • python PriorityQueue遍历

    要写一段遍历PriorityQueue中每个元素的代码 去网上找到的都是for循环 get 但是这样会把PriorityQueue中的元素取出来 得 问了chatGPT 没想到真有用 from queue import PriorityQu
  • Oracle 中 decode 函数用法

    Oracle 中 decode 函数用法 含义解释 decode 条件 值1 返回值1 值2 返回值2 值n 返回值n 缺省值 该函数的含义如下 IF 条件 值1 THEN RETURN 翻译值1 ELSIF 条件 值2 THEN RETU
  • 最新QQ强制搜索Api接口

    强制搜索QQ接口 QQ隐藏搜索不到的把他QQ放在 后面然后直接搜索链接就可以搜索到了 QQ设置了隐藏无法搜索使用这个隐藏都不管用的 进入官网 https apis hackeus cn 找到强制搜索接口点进去 后面输入QQ号即可
  • 用户账户控制(无法截图/退出全屏/使用窗口模式)

    用户账户控制提示框无法截图 这是我遇到的问题 如下 就是这种对话框 一般是程序请求管理员权限运行 就会弹出 默认是全屏状态 无法截图 试过什么PrintScreen等均不行 这里提供一个办法 把该提示框改变为窗口模式 而非全屏 就可以使用截
  • 数据结构--二叉堆与优先队列

    堆的一些性质 1 堆是一颗完全二叉树 2 堆的顶端一定是 最大 最小 的 但是要注意一个点 这里的大和小并不是传统意义下的大和小 它是相对于优先级而言的 3 堆一般有两种样子 小根堆和大根堆 分别对应第二个性质中的 堆顶最大 堆顶最小 对于
  • 毕业设计 - 基于云平台的火灾报警器 - stm32 物联网 单片机 OneNET云平台

    文章目录 0 简介 1 项目简介 2 开发环境 3 火焰传感器 4 连接OneNET云平台 5 演示效果 6 最后 0 简介 Hi 大家好 学长今天向大家介绍一个 单片机项目 基于云平台的火灾报警器 stm32 物联网 单片机 OneNET
  • 【linux kernel】挂载根文件系统之rootfs

    挂载根文件系统之rootfs 文章目录 挂载根文件系统之rootfs 一 开篇 二 rootfs根文件系统 2 1 初始化rootfs 2 2 挂载rootfs文件系统 2 3 创建简单的rootfs根文件系统目录和文件 2 4 打开0 1
  • [Python系列-27]:命令行解析器argparse详解

    作者主页 文火冰糖的硅基工坊 文火冰糖 王文兵 的博客 文火冰糖的硅基工坊 CSDN博客 本文网址 https blog csdn net HiWangWenBing article details 122276305 目录 第1章 arg
  • GB/T28181-2022相对2016版“基于TCP协议的视音频媒体传输要求“规范解读和技术实现

    规范解读 GB T28181 2022和GB T28181 2016规范 有这么一条 更改了附录 D 基于 TCP 协议的视音频媒体传输要求 见附录 D 2016 年版的附录 L 本文主要是针对GB T28181 2022里面提到的 基于
  • 【Java】Excel中添加下拉框

    0 两种方式 有两种方式可以实现 我仅在此记录一下 POI Hutool 1 使用 POI import org apache poi ss usermodel DataValidation import org apache poi ss
  • Web自动化元素定位

    元素定位就是通过元素的信息或元素层级结构来定位元素 要使用Web自动化操作元素 必须首先找到此元素 1 元素定位方式 1 1 基于元素属性特有的定位方式 1 id element driver find element by id id i
  • Python入门习题(91)——OpenJudge百练习题:汉诺塔问题

    OpenJudge百练第4147号习题 汉诺塔问题 题目描述 解题思路 参考答案 测试用例 小结 题目描述 来源 OpenJudge网站 百练习题集 第4147号习题 要求 总时间限制 1000ms 内存限制 65536kB 描述 一 汉诺