汉诺塔问题(递归写法)

简介: 给定一个由n个圆盘组成的塔,这些圆盘按照大小递减的方式套在第一根柱上。现要将整个塔移动到第三根柱上,每次只能移动一个圆盘,且较大的圆盘在移动过程中不能放置在较小的圆盘上面。

汉诺塔问题是一个很经典的题目

1.png

哈哈,其实就是我们都已经很熟悉游戏规则了,在此我就在啰嗦一遍题目。


2.gif

题目描述:

给定一个由n个圆盘组成的塔,这些圆盘按照大小递减的方式套在第一根柱上。现要将整个塔移动到第三根柱上,每次只能移动一个圆盘,且较大的圆盘在移动过程中不能放置在较小的圆盘上面。

输入:

输入只有一个正整数n

输出:

接下来每一行输出一步移动步骤。


在此,我们讨论比较一种简单而且很好理解的做法——递归做法,既然递归,我们只要想好递归函数,其它的就交给函数吧。

3.gif

好了,正经了,我们可以想象除了一个圆盘外最简单的一种情况——两个圆盘(哈哈),这种我们当然都知道了。

第一步:只要把上面的1号从A移动到B。

第二步:把2号从A移动到C。

第三步:再把1号从B移动到C就可以了。

(ps:手绘的图,大家就忍受下吧[委屈])

4.png

此时,我们想想,我们刚才的步骤是不是就是将两个圆盘从A借助B移动到了C。在我们将1号从A移动到B的时候我们也可以理解成把1号这个圆盘从A借助C移动到B(但是事实我们并没有借助)。这时我们就可以想象了,把那个1号圆盘当做成除了最下面那个圆盘外的(n-1)个圆盘,这时,是不是就豁然开朗了,对于n个圆盘我们一样可以分为三步走[嘻嘻]。


第一步:将(n-1)个圆盘从A借助C移动到B

第二步:将第n个圆盘从A移动到C

第三步:将(n-1)个圆盘从B借助A移动到C


代码实现下:


void hanoi(int n,char A,char B,char C)
{
    if(n==0)
        return ;
    hanoi(n-1,A,C,B);
    step(n,A,C);
    hanoi(n-1,B,A,C);
}

另外为了观察,我们还需要写一个打印移动步骤的函数。把id号圆盘从a位置移动到b位置。

上代码:


void step(int id,char a,char b) // 把id号圆盘从a位置移动到b位置
{
    cout<<"第"<<cnt++<<"步: 把  "<<id<<"号 从 "<<a<<" 移动到 "<<b<<endl;
}

输出结果:

至于输出的结果当然就是输出:将n个圆盘从A借助B移动到C的步数,也就是 hanoi(n,‘A’,‘B’,‘C’)。


完整代码:


#include<bits/stdc++.h>
using namespace std;
int cnt;
void step(int id,char a,char b)
{
    cout<<"第"<<cnt++<<"步: 把  "<<id<<"号 从 "<<a<<" 移动到 "<<b<<endl;
}
void hanoi(int n,char A,char B,char C)
{
    if(n==0)
        return ;
    hanoi(n-1,A,C,B);
    step(n,A,C);
    hanoi(n-1,B,A,C);
}
int main()
{
    int n;
    cnt=0;
    cin>>n;
    hanoi(n,'A','B','C');
    return 0;
}


相关文章
|
9月前
|
数据可视化 前端开发 JavaScript
地图可视化的艺术:深入比较Mapbox、OpenLayers、Leaflet和Cesium,不同场景下应如何选择地图库
选择合适的地图库取决于项目的需求、团队的技术栈以及预算等因素。简单来说,新手可以从leaflet入手;GIS开发使用openlayers会更顺手一些;mapbox适应大多数2D和2.5D场景,可视化效果好,但是不开源;cesium更侧重于3D场景。 只有锻炼思维才能可持续地解决问题,只有思维才是真正值得学习和分享的核心要素。如果这篇博客能给您带来一点帮助,麻烦您点个赞支持一下,还可以收藏起来以备不时之需,有疑问和错误欢迎在评论区指出
|
安全 Linux 编译器
在Linux中,如何查看内核版本?内核版本信息包含什么?
在Linux中,如何查看内核版本?内核版本信息包含什么?
|
NoSQL API Redis
使用Redis Lua脚本实现高级限流策略
使用Redis Lua脚本实现高级限流策略
503 0
|
运维 安全 程序员
如何使用远程控制软件并将用途最大化?4款国内外优质应用测评解析
如何使用远程控制软件并将用途最大化?4款国内外优质应用测评解析
422 0
如何使用远程控制软件并将用途最大化?4款国内外优质应用测评解析
|
XML 对象存储 Swift
Ceph对象存储的Amazon S3接口的使用(重点介绍分片上传接口)(基于nautilus版本)
Ceph对象存储的Amazon S3接口的使用(重点介绍分片上传接口)(基于nautilus版本)
991 0
|
开发框架 Dubbo 网络协议
SpringCloud + Gateway(网关) + Nacos(注册中心+配置中心)+ Dubbo(内部服务调用)
SpringCloud + Gateway(网关) + Nacos(注册中心+配置中心)+ Dubbo(内部服务调用)
2719 0
SpringCloud + Gateway(网关) + Nacos(注册中心+配置中心)+ Dubbo(内部服务调用)
|
缓存 Kubernetes 数据库
【kubernetes】Service: 将外部服务定位为 Service
【kubernetes】Service: 将外部服务定位为 Service
244 0
|
Windows
Windows 技术篇-设置计划任务,每天自动关机
Windows 技术篇-设置计划任务,每天自动关机
667 0
Windows 技术篇-设置计划任务,每天自动关机
|
安全 Java Android开发
【Android 安全】DEX 加密 ( 代理 Application 开发 | 加载 dex 文件 | 将系统的 dexElements 与 应用的 dexElements 合并 | 替换操作 )
【Android 安全】DEX 加密 ( 代理 Application 开发 | 加载 dex 文件 | 将系统的 dexElements 与 应用的 dexElements 合并 | 替换操作 )
310 0