~汉诺塔~(C语言)~

news2025/1/21 9:22:41

 引言   

        汉诺塔(Hanoi Tower),又称河内塔,源于印度一个古老传说。大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘。大梵天命令婆罗门把圆盘从上面开始按大小顺序重新摆放在另一根柱子上。 


1. 玩游戏 

        为了大家能更好的理解代码,建议去玩一下游戏,(电脑端)点这即可

        那么,话不多说,我们一起来看看吧! 


2. 题目描述

        有三根柱子,其中柱子上有一堆盘子,盘子按从小到大的顺序叠放。现在的目标是将所有的盘子按大小顺序重新叠放在另一根柱子上。并且规定,任何时候,小圆盘上都不能放大圆盘,且在三根柱子之间一次只能移动一个圆盘。我们该如何去实现呢?请列出移动步骤?


3. 题目分析

        解题思路:我们需要把圆盘看成一个一个的整体,将大事化小,繁事化简。并假设三个柱子分别为A、B、C(A:起始柱,B:中转柱,C:目标柱)。实际上,解决汉诺塔问题是有规律可循的:

  1. 当起始柱上只有 n=1 个圆盘时,我们可以很轻易地将它移动到目标柱
  2. 当起始柱上有 n=2 个圆盘时,移动过程是:先将起始柱上的第 1 个圆盘移动到辅助柱上,然后将起始柱上剩下的圆盘移动到目标柱上,最后将辅助柱上的圆盘移动到目标柱上。
  3. 当起始柱上有 n=3 个圆盘时,会发现,移动过程和 n=2 个圆盘的情况类似:先将起始柱上的 2 个圆盘移动到辅助柱上,然后将起始柱上遗留的圆盘移动到目标柱上,最后将辅助柱上的圆盘移动到目标柱上。

 

图 1 移动两个圆盘

图 2 移动三个圆盘

        通过分析以上 3 种情况的移动思路,可以总结出一个规律:对于 n 个圆盘的汉诺塔问题,移动圆盘的过程是:

  1. 将起始柱上的 n-1 个圆盘移动到辅助柱上;
  2. 将起始柱上剩下的 1 个圆盘移动到目标柱上;
  3. 将辅助柱上的所有圆盘移动到目标柱上。

        由此,n 个圆盘的汉诺塔问题就简化成了 n-1 个圆盘的汉诺塔问题。按照同样的思路,n-1 个圆盘的汉诺塔问题还可以继续简化,直至简化为移动 3 个甚至更少圆盘的汉诺塔问题。

        需要注意的是,在我们解决汉诺塔问题时,不能太过于深究圆盘移动的过程,一旦盘子数量较多,移动过程是极其复杂繁多的,容易把自己绕晕,我也不建议大家去理清移动过程。我们只需要理解汉诺塔的实现原理,运用大事化小,繁事化简的思想,就相对容易多了。

4. 代码实现 

        这里的递归限制条件为 n=1

#include<stdio.h>

// 移动盘子函数
void Move(char star, char goal)
{
    printf("%c --> %c\n", star, goal);
}

// 汉诺塔Hanno函数
void Hanno(int n, char star, char temp, char goal)
{
    // 如果只有一个盘子,直接移动
    if (n == 1)
    {
        Move(star, goal);
    }
    else
    {
        // 将 n-1 个盘子从起始柱移动到中转柱
        Hanno(n - 1, star, goal, temp);
        // 将剩余的一个盘子从起始柱移动到目标柱
        Move(star, goal);
        // 将之前移动到中转柱的 n-1 个盘子再从中转柱移动到目标柱
        Hanno(n - 1, temp, star, goal);
    }
}

int main()
{
    // 定义起始柱、中转柱、目标柱以及盘子数量
    char star = 'A';
    char temp = 'B';
    char goal = 'C';
    int numDish = 3; // 盘子数量
    // 调用移动盘子函数
    Hanno(numDish, star, temp, goal);
    return 0;
}
// 移动 2^numDish-1 次

5. 结语

        希望这篇文章对大家有所帮助,如果你有任何问题和建议,欢迎在评论区留言,这将对我有很大的帮助。

        完结!咻~

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

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

相关文章

[计算机网络]深度学习传输层TCP协议

&#x1f493; 博客主页&#xff1a;从零开始的-CodeNinja之路 ⏩ 收录专栏&#xff1a;深度学习传输层TCP协议 &#x1f389;欢迎大家点赞&#x1f44d;评论&#x1f4dd;收藏⭐文章 [计算机网络]深度学习传输层TCP协议 前提概括一: TCP协议段格式二:确认应答三:超时重传四:…

IgG1 (mouse), ELISA kit——ENZO热销产品

90分钟内可得结果的高特异性定量ELISA试剂盒 免疫球蛋白G&#xff08;IgG&#xff09;是一种免疫球蛋白单体&#xff0c;由两条&#xff08;γ&#xff09;重链和两条轻链组成。每个IgG分子包含两个抗原结合域和一个效应&#xff08;Fc&#xff09;域。Enzo Life Sciences可提供…

【hcie-cloud】【29】华为云Stack数据安全服务

文章目录 前言数据安全概述数据产业发展和敏感数据上云趋势下对数据安全的需求重大隐私数据泄露事件云端数据安全问题成为业务上云的主要障碍数据安全相关法律法规密集出台数据安全法 - 欧盟的GDPR中国的数据安全法端到端考虑数据安全数据安全生命周期华为云Stack全生命周期数据…

七、Mybatis缓存

缓存就是内存中的数据&#xff0c;常常来自对数据库查询结果的保存&#xff0c;使用缓存、可以避免频繁的与数据库进行交互&#xff0c;进而提高响应速度一级缓存是sqlSession级别的缓存&#xff0c;在操作数据库时需要构造sqlsession对象&#xff0c;在对象中有一个数据结构&a…

WEB APIs(2)

应用定时器可以写一个定时轮播图&#xff0c;如下 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" content"IEedge"><meta name"viewport&qu…

React 更改程序入口点(index.js文件位置变更)

食用前提示&#xff1a;本文基于已经快速配置好的React环境而作&#xff0c;配置React环境详见拙作&#xff1a;React环境配置-CSDN博客~ 一、了解默认入口点 使用create-react-app快速搭建react环境后&#xff0c;npm start启动程序的默认入口点为/src/index(即src目录下的ind…

《白话C++》第10章 STL和boost,Page70~72 boost::scoped_ptr

《泛型》篇中提到的某个IT项目的辩论会&#xff0c; 一派坚持智能指针和裸指针可以“离婚”&#xff0c;它们是std::auto_ptr的支持者&#xff0c; 一派认为智能指针和裸指针不可以“离婚”&#xff0c;boost::scoped_ptr体现了他们的观点&#xff1a; boost::scoped_ptr基本…

OpenAI视频生成模型Sora的全面解析:从扩散Transformer到ViViT、DiT、VideoPoet

前言 真没想到&#xff0c;距离视频生成上一轮的集中爆发才过去三个月&#xff0c;没想OpenAI一出手&#xff0c;该领域又直接变天了 自打2.16日OpenAI发布sora以来&#xff0c;不但把同时段Google发布的Gemmi Pro 1.5干没了声音&#xff0c;而且网上各个渠道&#xff0c;大量…

NHANES数据库使用(1)

官网&#xff1a;NHANES - National Health and Nutrition Examination Survey Homepagehttps://www.cdc.gov/nchs/nhanes/index.htm 1、打开数据库 2、 选择数据集 B区检索方法和变量。C区检索数据集。A区含有B区和C区的功能。选择 NHANES 2017-March 2020打开。 3、打开数据…

普通人做抖音小店真的能赚钱吗?别在做美梦了,都醒醒吧!

大家好&#xff0c;我是电商糖果 糖果做电商七年了&#xff0c;这中间也起起落落过&#xff0c;2020年开始做抖音小店。 虽然靠着小店自己有了团队&#xff0c;翻了身。 但是只要有人问糖果&#xff0c;普通人做抖音小店真的能赚到钱吗&#xff1f; 我的回答依旧是看个人。…

最长子串和回文子串相关的算法题解

这里写目录标题 一、3. 无重复字符的最长子串二、5. 最长回文子串三、647. 回文子串四、516. 最长回文子序列 一、3. 无重复字符的最长子串 中等 给定一个字符串 s &#xff0c;请你找出其中不含有重复字符的 最长子串 的长度。 示例 1: 输入: s “abcabcbb” 输出: 3 解释:…

ClickHouse从入门到精通(高级)

第1章 Explain查看执行计划 第2章 建表优化 第3章 ClickHouse语法优化规则 第4章 查询优化 第5章 数据一致性(重点) 第6章 物化视图 第7章 MaterializeMySQL引擎 第8章 常见问题排查

阿里云香港轻量应用服务器怎么样,建站速度快吗?

阿里云香港服务器中国香港数据中心网络线路类型BGP多线精品&#xff0c;中国电信CN2高速网络高质量、大规格BGP带宽&#xff0c;运营商精品公网直连中国内地&#xff0c;时延更低&#xff0c;优化海外回中国内地流量的公网线路&#xff0c;可以提高国际业务访问质量。阿里云服务…

智慧城市与数字孪生:实现城市可持续发展的关键

一、引言 随着全球城市化进程的加速&#xff0c;城市面临着诸多挑战&#xff0c;如资源紧张、环境恶化、交通拥堵等。为了解决这些问题&#xff0c;智慧城市的概念应运而生。智慧城市利用先进的信息通信技术&#xff0c;提升城市治理水平&#xff0c;改善市民的生活质量。而数…

基于8086单片机的数码管计时系统[proteus仿真]

基于8086单片机的数码管计时系统[proteus仿真] 8086仿真设计这个题目算是课程设计中常见的题目了&#xff0c;本期是一个基于8086单片机的数码管计时系统[proteus仿真] 需要的源文件和程序的小伙伴可以关注公众号【阿目分享嵌入式】&#xff0c;赞赏任意文章 2&#xffe5;&a…

IPsec、安全关联、网络层安全协议

网络层安全协议 IP 几乎不具备任何安全性&#xff0c;不能保证&#xff1a; 1.数据机密性 2.数据完整性 3.数据来源认证 由于其在设计和实现上存在安全漏洞&#xff0c;使各种攻击有机可乘。例如&#xff1a;攻击者很容易构造一个包含虚假地址的 IP 数据报。 IPsec 提供了标…

从零开始做题:逆向 ret2libc jarvisoj level1

1.题目信息 BUUCTF在线评测 2.原理 篡改栈帧上的返回地址为攻击者手动传入的shellcode所在缓冲区地址&#xff0c;并且该区域有执行权限。 3.解题步骤 3.1 首先使用checksec工具查看它开了啥保护措施 基本全关&#xff0c;栈可执行。 rootpwn_test1604:/ctf/work/9# chec…

RabbitMQ之 Direct 交换机

&#x1f47d;System.out.println(“&#x1f44b;&#x1f3fc;嗨&#xff0c;大家好&#xff0c;我是代码不会敲的小符&#xff0c;双非大四&#xff0c;Java实习中…”); &#x1f4da;System.out.println(“&#x1f388;如果文章中有错误的地方&#xff0c;恳请大家指正&a…

【python】python入门(变量名)

Hi~ o(*&#xffe3;▽&#xffe3;*)ブ今天一起来看看python入门之变量名吧~~ 变量名的规定&#xff1a; 举个例子&#xff1a; “违法”的变量名们 my love/my &#xff01;love错误&#xff1a;中间不能是空格或者其他符号1my_love错误&#xff1a;不能数字开头"my_l…

【Spring底层原理高级进阶】轻松掌握 Spring MVC 的拦截器机制:深入理解 HandlerInterceptor 接口和其实现类的用法

&#x1f389;&#x1f389;欢迎光临&#x1f389;&#x1f389; &#x1f3c5;我是苏泽&#xff0c;一位对技术充满热情的探索者和分享者。&#x1f680;&#x1f680; &#x1f31f;特别推荐给大家我的最新专栏《Spring 狂野之旅&#xff1a;底层原理高级进阶》 &#x1f680…