【经典问题:HanoiTower(汉诺塔)】

news2025/1/19 11:26:40

🎁HanoiTower

  • 🎅HanoiTower问题描述
  • 🎅🎅模拟推导
  • 🎅🎅🎅问题的两种形式
    • 🎄求解移动总次数
    • 🎄🎄打印详细的移动过程

🎅HanoiTower问题描述

汉诺塔问题:给定A,B,C三根柱子,A为源柱,C为目标柱,B作为中转站起辅助作用,在一开始A柱上放置了N个盘子,这N个盘子自顶向下尺寸由小到大,我们的目的是,将A柱上的所有盘子均移动到C柱上,且C柱上最后盘子呈现的放置效果和A中一样。在整个移动的过程中,对于移动操作有两个限制:1)每次只能移动一个盘子;2)盘子叠放时,必须小的在上,大的在下。

这里给出一个N=3时的汉诺塔示意图:
在这里插入图片描述

我们的目的就是将A中的三个盘子都移动到C中,最后呈现出入下所示的效果:
在这里插入图片描述

这里面B柱的作用很重要,你可以想一下:给你一瓶康师傅红茶A和一瓶康师傅绿茶C,我现在让你把红茶装在绿茶瓶子C里,而绿茶装在红茶瓶子A里,你要怎么做?是不是需要先把红茶倒在一个空瓶B中,然后将绿茶倒到现在已经空的红茶瓶子A中,最后将B瓶中的红茶装到空的绿茶瓶子C中,就完成了交换工作呢,这里B就是辅助完成交换工作的角色。

🎅🎅模拟推导

这里分别以N=1,2,3三种基础汉诺塔为例,进行移动的模拟过程,需要提前说明我们将A中所有盘子自顶向下编号为①,②,…:
1)N=1,此时A中只有一个盘子①,此时只需要一步操作(1),①:A->C即可完成整个移动过程;
2)N=2,此时A中有两个盘子,且自顶向下,根据盘子尺寸编号为①,②,此时移动过程如下:

  • (1)①:A->B,;
  • (2)②:A->C,完成最大盘②的移动工作;
  • (3)①:B->C,完成①盘的移动过程,也就是完成了完整的移动过程;
    在这里插入图片描述

3)N=3,此时A中有三个盘子,且自顶向下,根据盘子尺寸编号为①,②,③此时移动过程如下:

  • (1)①:A->C,;
  • (2)②:A->B,C柱作为辅助;
  • (3)①:C->B,C柱作为辅助,此时①②盘均在B柱中;
  • (4)③:A->C,此时最大的盘子③已经移动到目标柱C中了;
  • (5)①:B->A,A柱作为辅助;
  • (6)②:B->C,完成②盘的移动工作;
  • (7)①:A->C,A柱作为辅助,完成①盘的移动工作,也完成了整个移动过程;
    在这里插入图片描述

到这里应该对这个问题有了一个明显的体会了,至少已经知道如何去移动这些盘子了,那么由此会引出一些问题,比如给定盘子数量N,那么至少需要多少步操作可以完成A到C的迁移工作呢,等等。

🎅🎅🎅问题的两种形式

最常见的两种相关问题形式如下,一个是求最少移动次数,另一个是打印出具体的移动过程,我们分别来看一下这些问题:

🎄求解移动总次数

我记得我第一次碰到这个问题应该是高中数学学习数学归纳法那里吧。这个问题比较简单,只需要分别模拟N=1,2,3时的移动过程,找到盘子数量与移动次数之间的关系表达式即可求解该问题。
那么来看一下,上一节我已经完整描述了他们各自的移动过程,有以下结论:

盘子数量N移动次数hanoi(N)
N=1hanoi(1)=1
N=2hanoi(2)=3
N=3hanoi(1)=7

大家有没有发现什么规律呢?我用公式来描述这个规律如下:

在这里插入图片描述
也就是说除了只有一个盘子这种特殊情况以外,其他情况时N个盘子对应的移动次数都和N-1盘子对应的情况有关,这显然是一个递归调用过程
给出Java代码:

public int hanoi(int n) {
	// 特殊情况:n=1
    if (n==1){
        return 1;
    }
    // 其他情况:
    return 2*hanoi(n-1)+1;
}

🎄🎄打印详细的移动过程

上面的问题只能得到移动次数,但是具体怎么移动的我们并不清楚,而汉诺塔相关的另一问题就是,打印出具体详细的移动过程,类似如下信息:
在这里插入图片描述

给出Java代码:
还是递归的思想,递归的核心是什么?我们要知道我们定义的这个递归函数的语义:这个函数是用来干什么的,它的输入是什么,它能实现什么功能呢?这是写出一个递归函数所要掌握的能力。
比如这里递归函数是hanoi(int n,char A,char B,char C),那么A表示源地址,C表示目标地址,B作为辅助的中转站存在,我通过这个函数可以将源A中的所有盘子移动到目的C中。而整个移动过程可以分为以下三大步:

  • 将A中最大盘上面的n-1个盘子全部移动到B中,暂时存放,此时C起到辅助的作用;
  • 将最大盘n直接移动到目的位置C中;
  • 将B中的n-1个盘子移动到C中,完成整个移动过程,在此期间A作为辅助出现,防止移动操作违背移动规则;
public int steps=0;  // 记录移动次数
/**
 * 将源柱A中的n个盘子移动到目标柱C中,B柱作为辅助
 * @param n  盘子数量
 * @param A  源柱
 * @param B  辅助
 * @param C  目标柱
 */
public void hanoi(int n,char A,char B,char C) {
    // 特殊情况,一步操作
    if (n==1){
        steps++;
        printMovePath(1,A,C);
        return;
    }
    // 将A上的n-1个盘子移动到B中,C作为辅助
    hanoi(n-1,A,C,B);
    // 将A中的第n个盘子直接移动到C中
    steps++;
    printMovePath(n,A,C);
    // 将B上的n-1个盘子移动到C中,A作为辅助
    hanoi(n-1,B,A,C);
}

// 将目标src中的编号为n的盘子移动到dst中
public void printMovePath(int n, char src, char dst) {
    System.out.printf("第%d次移动,移动盘子%d:%c->%c\n",steps,n,src,dst);
}

n=3时的移动过程如图所示:
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/106248.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

基于HMM模型实现中文分词

任务描述:在理解中文文本的语义时需要进行分词处理,分词算法包括字符串匹配算法,基于统计的机器学习算法两大类。本案例在前文将说明常用分词库及其简单应用,之后会通过中文分词的例子介绍和实现一个基于统计的中文分词方法——HMM模型,该模型能很好地处理歧义和未登录词问…

[含文档+源码等]基于SSM实现的宿舍公共财产管理系统|寝室

博主介绍:✌在职Java研发工程师、专注于程序设计、源码分享、技术交流、专注于Java技术领域和毕业设计✌ 项目名称 [含文档源码等]基于SSM实现的宿舍公共财产管理系统|寝室 演示视频 [含文档源码等]基于SSM实现的宿舍公共财产管理系统|寝室_哔哩哔哩_bilibili 系统介…

经济低迷形势下,如何降低软件开发成本?

1、选对开发方法 过程决定结果。方法错了,再有经验的人,结果也不会好。例如,软件开发方法从70年代的瀑布,一步步从迭代、快速原型等进化到现在的敏捷、规模化敏捷、DevOps等。统计数字显示,使用敏捷方法,平…

Excel中实现时间相减,得到间隔时间(年月日时分秒)

一、年月日之差 表中有开始日期和结束日期,我们在D3单元格中输入“C3-B3” 于是,得到下面的结果 很显然,结果并不是我们想要的。说明这种方法不行,为了得到两个日期之间的时间间隔,需要用到DATEDIF函数。先来说下DATED…

我国融资性担保行业整体呈减量提质趋势 国家“出手”解决行业痛点

根据观研报告网发布的《中国融资性担保行业发展趋势分析与投资前景预测报告(2022-2029年)》显示,融资性担保行业是指担保人与银行业金融机构等债权人约定,当被担保人不履行对债权人负有的融资性债务时,由担保人依法承担…

Go:使用 go-micro 构建微服务(一)

一、微服务 什么是微服务(microservice)?这是企业界正在向计算界提出的问题。一个产品的可持续性取决于它的可修改程度。 大型产品如果不能正常维护,就需要在某个时间点停机维护。而微服务架构用细化的服务取代了传统的单体服务…

语音识别芯片LD3320介绍再续

语音识别芯片LD3320驱动程序 1、芯片复位 复位就是对LD3320芯片的第47腿(RSTB*)发送低电平,然后需要对片选CS做一次拉低→拉 高的操作,以激活内部DSP。按照以下顺序: void LD_reset() { RSTB1;delay(1);RSTB0;delay…

TencentOS 3.1下安装zabbix 5.0.30

TencentOS是使用官方镜像文件安装的虚拟机。 虚拟机为virtualBox 6.1 zabbix 使用zabbix官方安装包编译安装。 下载地址: Download Zabbix sources zabbix软件包解包,本次安装解包在/opt下 zabbix需要nginx、php、mysql等软件支持,因此先安装它们。 安装mysql如下: yu…

Usaco Training刷怪旅 第二层第二题:Transformations

usaco training 关注我持续更新usaco training A square pattern of size N x N (1 < N < 10) black and white square tiles is transformed into another square pattern. Write a program that will recognize the minimum transformation that has been applied to t…

QCon直击|闲鱼推荐大规模应用背后的工程实践

讲师介绍闲鱼技术部 | 吴白万小勇&#xff08;吴白&#xff09;&#xff0c;闲鱼服务端专家。毕业于南京大学计算机系&#xff0c;目前负责闲鱼技术推荐架构。推荐在闲鱼的应用不同于搜索的确定性&#xff0c;推荐场景面临的问题往往是不确定的。但是正是因为这种不确定&#x…

Kafka无法对外暴露端口的相关解决方案

1、kafka开放外部访问 1.1、修改kafka configMap 修改内容如下 # 修改EXTERNAL_ACCESS_IP变量&#xff0c;值为真实的外网IP export EXTERNAL_ACCESS_IP${真实的外网IP} 1.2、重启kafka # 重启kafka kubectl rollout restart statefulset kafka -n default # 查看kafka状态 k…

盛邦安全将于12月27日上会,2022年前三季度收入1亿元

12月20日&#xff0c;上海证券交易所披露的科创板上市委2022年第112次审议会议公告显示&#xff0c;远江盛邦&#xff08;北京&#xff09;网络安全科技股份有限公司&#xff08;下称“盛邦安全”&#xff09;将于2022年12月27日上会。 目前&#xff0c;盛邦安全已经提交了招股…

在tushare量化平台可以获取哪些数据?

沪深股票数据是Tushare量化最传统、最具历史意义的数据服务项目从一开始就为投资者特别是定量投资者提供了稳定、方便的接口。 1.基础数据 提供交易和回测所需要的基础信息&#xff0c;目前主要提供的是上市公司股票列表和交易日历等 2.行情数据 行情数据目前还在继续规则和…

“史上最贵”卡塔尔世界杯,有哪些炫酷的“黑科技”?

2022年卡塔尔世界杯投入超过2200亿美元&#xff0c;堪称“史上最贵世界杯”。这些投入不仅用在了场馆、道路等基础设施建设中&#xff0c;也体现在让人震撼的芯片传感器、人工智能、先进技术等“黑科技”上。今年的卡塔尔世界杯有什么“科技感十足”的先进技术&#xff1f;让我…

坐标系相关整理

参考url:https://www.jianshu.com/p/06890af3d780 Dicom坐标系 x轴&#xff1a;从右手到左手 y轴&#xff1a;从前胸到后背 z轴&#xff1a;从脚到头 解刨学坐标系 医学人体三解剖面&#xff0c;医疗影像三维图&#xff0c;主要是针对人体来说。解剖学上的坐标体系&#xff0…

常见垃圾回收器

1.Serial垃圾回收器 Serial&#xff08;串行&#xff09;收集器是最基本、历史最悠久的垃圾收集器了&#xff0c;是一个单线程收集器 它只会使用一个垃圾收集线程去完成垃圾收集工作 它在进行垃圾收集工作的时候必须暂停其他所有的工作线程&#xff08; "Stop The Worl…

C++——STL之vector详解

C——STL之vector详解&#x1f3d0;1.什么是vector&#x1f3d0;2.vector的使用&#x1f3c0;2.1vector的实例化&#x1f3c0;2.2访问遍历vector⚽2.2.1**下标[]**⚽2.2.2**迭代器**⚽2.2.3**范围for**&#x1f3c0;2.3.vector容量问题⚽2.3.1size和capacity⚽2.3.2reserve和re…

二叉树先、中、后遍历递归+非递归

文章目录前言思路设计思想非递归前序遍历的思路非递归中序遍历的思路非递归后序遍历的思路层序遍历的思路完整代码MyBinaryTree.hMyBinaryTree.cppMain.cpp效果展示前言 作者水平有限&#xff0c;全部的代码是学习前人部分原创不要搬代码&#xff0c;一定要借鉴学习&#xff0…

接口测试的痛点和解决办法

在做接口测试时&#xff0c;以下几个测试痛点&#xff0c;一定要仔细琢磨下&#xff1a; 痛点①&#xff1a;由于测试环境数据被改动&#xff0c;导致接口测试失败 这个问题&#xff0c;最好的办法就是重新调用数据库中的最新数据。在做测试用例时&#xff0c;也要考虑到实时调…

汽车服务行业概况与供应商评估方案介绍,数商云SRM系统助力多维考核供应商

近年来&#xff0c;汽车保有量不断增长&#xff0c;中国汽车市场连续多年成为全球产销第一&#xff0c;伴随物联网技术的不断渗透&#xff0c;车联网开始兴起&#xff0c;带给线上线下汽车相关服务行业新的发展机遇。 当前汽车服务行业整体概况 1、市场需求增加&#xff1a;市…