【C语言】汉诺塔 —— 详解

一、介绍
汉诺塔(Tower of Hanoi),又称河内塔,是一个源于印度古老传说的益智玩具。大焚天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘。 大焚天命令婆罗门把圆盘从下面开始按大小顺序重新摆放在另一根柱子上。并且规定,在小圆盘上不能放大圆盘,在三根柱子之间一次只能移动一个圆盘。
面试题 08.06. 汉诺塔问题 - 力扣(LeetCode)
二、问题描述
有 A,B,C 三根柱子,A 上面有 n 个盘子,我们想把 A 上面的盘子移动到 C 上,但是必须要满足以下三个条件:
- 每次只能移动一个盘子;
- 盘子只能从柱子顶端滑出移到下一根柱子;
- 盘子只能叠在比它大的盘子上。

三、解题思路
这是一道递归方法的经典题目。
1、如果 n = 1,只有一个盘子,那么就直接将它从 A 移到 C 上
2、如果 n = 2,这时我们就需要借助 B,因为小盘子必须时刻都在大盘子上面,共需要 4 步

3、如果 n > 2,思路和上面是一样的。我们将 n 个盘子看成两个部分,一部分有 1 个盘子,另一部分有 n-1 个盘子

可是,那 n-1 个盘子是如何从 A 移动到 B 再移动到 C 的呢?
将最初的 n 个盘子从 A 移到 C 的问题,转化成了将 n-1 个盘子从 A 移到 C 的问题, 以此类推,直至转化成 1 个盘子的问题时,这个问题也就解决了。这里利用了分治的思想。
- 当 n = 1 时,直接将盘子从 A 移到 C 上;
- 当 n > 1 时,
- 先把上面的 n-1 个盘子从 A 借助 C 移动到 B(化为子问题,进行递归);
- 再将 A 上最后一个盘子从 A →C;
- 再将 B 上 n - 1 个盘子从 B 借助 A 移动到 C(化为子问题,进行递归)。
四、代码
#include<stdio.h>void move(char A, char C, int n)
{printf("把第%d个圆盘从%c——>%c\n", n, A, C);
}void HanoiTower(char A, char B, char C, int n)
{if (n == 1){move(A, C, n);}else{// 1.把A上n-1个圆盘从A柱借助C移动到B上HanoiTower(A, C, B, n - 1);// 2.将A最后一个圆盘从A->Cmove(A, C, n);// 3.把B上n-1个圆盘从B借助A移动到C上HanoiTower(B, A, C, n - 1);}
}int main()
{int n = 0;printf("输入A柱上的圆盘的个数:");scanf("%d\n", &n);//将n个圆盘从A柱借助B柱移动到C柱上HanoiTower('A', 'B', 'C', n);return 0;
}
五、扩展
如果想要计算移动了多少次盘子,只需要加入多一个 move() 函数即可。
相关文章:
【C语言】汉诺塔 —— 详解
一、介绍 汉诺塔(Tower of Hanoi),又称河内塔,是一个源于印度古老传说的益智玩具。大焚天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘。 大焚天命令婆罗门把圆盘从下面开始按…...
【云备份】
文章目录 [toc] 1 :peach:云备份的认识:peach:1.1 :apple:功能了解:apple:1.2 :apple:实现目标:apple:1.3 :apple:服务端程序负责功能:apple:1.4 :apple:服务端功能模块划分:apple:1.5 :apple:客户端程序负责功能:apple:1.6 :apple:客户端功能模块划分:apple: 2 :peach:环境搭建…...
第四十六章 命名空间和数据库 - 系统提供的数据库
文章目录 第四十六章 命名空间和数据库 - 系统提供的数据库系统提供的数据库ENSLIBIRISAUDITIRISLIBIRISLOCALDATAIRISSYS (the system manager’s database 系统管理器的数据库)IRISTEMP 第四十六章 命名空间和数据库 - 系统提供的数据库 系统提供的数据库 IRIS 提供以下数据…...
【贪心的商人】python实现-附ChatGPT解析
1.题目 贪心的商人 知识点:贪心 时间限制:1s 空间限制: 256MB 限定语言:不限 题目描述: 商人经营一家店铺,有number种商品,由于仓库限制 每件商品的最大持有数量是item[index], 每种商品的价格在每天是item_price[item_index][day], 通过对商品的买进和卖出获取利润,请给…...
解决nvm切换node版本失败的终极办法-秒杀网上99%的水文
nvm是一款强大的node多版本管理器,可以轻易选择你需要的node版本,这对win7平台简直就是超好的福音:可以突破node 14.15以上的安装限制。 但是nvm安装有一个巨大的坑点:nvm use 版本号以后,并没有生效,nvm …...
2023蓝帽杯半决赛电子取证+CTF部分题解
文章目录 电子取证123456789101112131415 CTFWeb | MyLinuxBotWeb | AirticleShareCrypto | ezrsaPwn | AdminPwn | uafmisc|排排坐吃吃果果 电子取证 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 CTF Web | MyLinuxBot Web | AirticleShare import requests import times reques…...
OCTA数据集(Rose)+ OCTA-Net
ROSE: A Retinal OCT-Angiography(视网膜眼底相干光层析血管成像术) Vessel Segmentation(血管分割) Dataset and New Model 论文:ROSE: A Retinal OCT-Angiography Vessel Segmentation Dataset and New Model 代码和数据集:ROSE1&2 - 医疗影像/眼…...
java Spring Boot 手动启动热部署
好 接下来 我们讲一个对开发非常重要的东西 热部署 因为 我们在开发过程中总会希望快点看到效果 或者 你的企业项目一般很大很复杂,重启是一件非常麻烦的事 或者你在和前端同事联调,有一点小问题 你改完就要重启 前端还得等你,非常不友好 那…...
Autosar诊断实战系列20-UDS首帧数据接收及流控帧发送代码级分析
本文框架 前言1. 长帧数据的首帧接收2. 首帧数据的处理及流控帧发送2.1 首帧数据的处理2.2 流控帧数据的发送前言 在本系列笔者将结合工作中对诊断实战部分的应用经验进一步介绍常用UDS服务的进一步探讨及开发中注意事项, Dem/Dcm/CanTp/Fim模块配置开发及注意事项,诊断与Bs…...
C/C++ 数据结构 - 队列
1.队列 https://blog.csdn.net/LiuBo_01/article/details/80412290 1 #include <stdio.h>2 #include <stdlib.h>3 4 typedef struct Node5 {6 int data;7 struct Node* next;8 }N;9 10 typedef struct11 {12 N* front;13 N* rear;14 }Q;15 16 //…...
免杀对抗-DLL劫持免杀
C&Py-DLL劫持-语言-调用加载 1.使用visual studio创建项目 2.将文件名重命名为.c后缀 3.将如下加载器代码生成dll文件 加载器代码: #include "pch.h" #include <Windows.h> #include <stdio.h> #include <string.h>#pragma comment…...
Anaconda添加channels后出现unexpected urllib3 DEBUG logging from conda-build
1.问题描述 anaconda更新之后添加channels后出现bug: (base) ~/zlib-feedstock % conda build recipe 2>&1 | tee out ... INFO:conda_build.metadata:Attempting to finalize metadata for libzlib DEBUG:urllib3.connectionpool:Starting new HTTPS connection (1):…...
python 将二维数组的数据保存到csv文件中
import csv# 将数据保存为有标题(第一行为标题)的csv文档 lst [[日期, 最高气温, 最低气温, 天气, 风向],[2022-10-01 星期六, 34℃, 25℃, 雾, 东风 1级],[2022-10-02 星期日, 37℃, 26℃, 晴, 东南风 1级],[2022-10-03 星期一, 38℃, 24℃, 晴, 南风 1级],[2022-10-04 星期二…...
UGUI交互组件Button
一.初识Button对象 从菜单中创建Button对象,Button的文本由子节点Text对象显示,Button对象的组件除了基础组件外,还有Image用来显示Button常规态的图片,还有Button组件用来控制点击过渡效果和点击事件的响应。 二.Button组件的属…...
认知智能最新研究成果
声明:以下内容仅代表个人对现象和本质探索,不代表对学术成果评价。曾有幸和马文明斯基的学生段老师和方老师一起讨论过人工智能问题。随着自己对问题进一步理解,刚好18年左右开始接触认知智能理论核心认知计算部分。 第一:算法是一…...
Armv8/Armv9 Cache知识大纲分享--思维导图
关键词:cache学习、mmu学习、cache资料、mmu资料、arm资料、armv8资料、armv9资料、 trustzone视频、tee视频、ATF视频、secureboot视频、安全启动视频、selinux视频,cache视频、mmu视频,armv8视频、armv9视频、FF-A视频、密码学视频、RME/CC…...
如何使用百度“云一朵”来分析PDF文件
PDF 文件是一种常见的文件格式,用于存储文档、图像和其他内容。在许多情况下,我们需要对 PDF 文件进行分析,以提取其中的信息。百度“云一朵”提供了一个 PDF 分析 API,可以帮助我们轻松地对 PDF 文件进行分析。 在本博客文章中&…...
IIS解决上传文件大小限制
IIS解决上传文件大小限制 目的:通过配置文件和IIS来解决服务器对上传文件大小的限制 1:修改配置文件(默认为4M 值的大小根据自己情况进行修改) <httpRuntime maxRequestLength"2048000" /> 2:修改IIS配…...
多源最短路径的原理及C++实现
时间复杂度 O(n3),n是端点数。 核心代码 template<class T, T INF 1000 * 1000 * 1000> class CNeiBoMat { public: CNeiBoMat(int n, const vector<vector<int>>& edges,bool bDirectfalse,bool b1Base false) { m_vMat.assign(n, vector<…...
JMeter性能测试
性能测试前言 老师开局一句话:性能测试和你会不会JMeter一点关系没有…… 作者坚持技多不压身的原则,还是多学一点JMeter吧,看老师到底要怎么讲下去,什么并发量、吞吐量啥的…… 性能测试的核心思想:在于创造大量并发去…...
使用分级同态加密防御梯度泄漏
抽象 联邦学习 (FL) 支持跨分布式客户端进行协作模型训练,而无需共享原始数据,这使其成为在互联和自动驾驶汽车 (CAV) 等领域保护隐私的机器学习的一种很有前途的方法。然而,最近的研究表明&…...
【CSS position 属性】static、relative、fixed、absolute 、sticky详细介绍,多层嵌套定位示例
文章目录 ★ position 的五种类型及基本用法 ★ 一、position 属性概述 二、position 的五种类型详解(初学者版) 1. static(默认值) 2. relative(相对定位) 3. absolute(绝对定位) 4. fixed(固定定位) 5. sticky(粘性定位) 三、定位元素的层级关系(z-i…...
【AI学习】三、AI算法中的向量
在人工智能(AI)算法中,向量(Vector)是一种将现实世界中的数据(如图像、文本、音频等)转化为计算机可处理的数值型特征表示的工具。它是连接人类认知(如语义、视觉特征)与…...
在web-view 加载的本地及远程HTML中调用uniapp的API及网页和vue页面是如何通讯的?
uni-app 中 Web-view 与 Vue 页面的通讯机制详解 一、Web-view 简介 Web-view 是 uni-app 提供的一个重要组件,用于在原生应用中加载 HTML 页面: 支持加载本地 HTML 文件支持加载远程 HTML 页面实现 Web 与原生的双向通讯可用于嵌入第三方网页或 H5 应…...
ABAP设计模式之---“简单设计原则(Simple Design)”
“Simple Design”(简单设计)是软件开发中的一个重要理念,倡导以最简单的方式实现软件功能,以确保代码清晰易懂、易维护,并在项目需求变化时能够快速适应。 其核心目标是避免复杂和过度设计,遵循“让事情保…...
使用Spring AI和MCP协议构建图片搜索服务
目录 使用Spring AI和MCP协议构建图片搜索服务 引言 技术栈概览 项目架构设计 架构图 服务端开发 1. 创建Spring Boot项目 2. 实现图片搜索工具 3. 配置传输模式 Stdio模式(本地调用) SSE模式(远程调用) 4. 注册工具提…...
C++:多态机制详解
目录 一. 多态的概念 1.静态多态(编译时多态) 二.动态多态的定义及实现 1.多态的构成条件 2.虚函数 3.虚函数的重写/覆盖 4.虚函数重写的一些其他问题 1).协变 2).析构函数的重写 5.override 和 final关键字 1&#…...
C#学习第29天:表达式树(Expression Trees)
目录 什么是表达式树? 核心概念 1.表达式树的构建 2. 表达式树与Lambda表达式 3.解析和访问表达式树 4.动态条件查询 表达式树的优势 1.动态构建查询 2.LINQ 提供程序支持: 3.性能优化 4.元数据处理 5.代码转换和重写 适用场景 代码复杂性…...
Windows安装Miniconda
一、下载 https://www.anaconda.com/download/success 二、安装 三、配置镜像源 Anaconda/Miniconda pip 配置清华镜像源_anaconda配置清华源-CSDN博客 四、常用操作命令 Anaconda/Miniconda 基本操作命令_miniconda创建环境命令-CSDN博客...
【LeetCode】算法详解#6 ---除自身以外数组的乘积
1.题目介绍 给定一个整数数组 nums,返回 数组 answer ,其中 answer[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积 。 题目数据 保证 数组 nums之中任意元素的全部前缀元素和后缀的乘积都在 32 位 整数范围内。 请 不要使用除法,且在 O…...
