Leetcode刷题详解——汉诺塔问题

news2025/1/20 13:29:07

1. 题目链接:面试题 08.06. 汉诺塔问题

2. 题目描述:

在经典汉诺塔问题中,有 3 根柱子及 N 个不同大小的穿孔圆盘,盘子可以滑入任意一根柱子。一开始,所有盘子自上而下按升序依次套在第一根柱子上(即每一个盘子只能放在更大的盘子上面)。移动圆盘时受到以下限制:
(1) 每次只能移动一个盘子;
(2) 盘子只能从柱子顶端滑出移到下一根柱子;
(3) 盘子只能叠在比它大的盘子上。

请编写程序,用栈将所有盘子从第一根柱子移到最后一根柱子。

你需要原地修改栈。

示例1:

 输入:A = [2, 1, 0], B = [], C = []
 输出:C = [2, 1, 0]

示例2:

 输入:A = [1, 0], B = [], C = []
 输出:C = [1, 0]

提示:

  1. A中盘子的数目不大于14个。

3. 解法(递归)

3.1 算法思路:

  1. 假设 n=1,只有一个盘子,直接把它从A拿出来,移动到C上

请添加图片描述

  1. 如果n=2呢?这时候我们就要借助B了,因为小盘子必须时刻都在大盘子上面,共需要3步(为了方便叙述,记A中盘子从上到下为1号、2号:

请添加图片描述

  1. 如果n>2呢?这是我们需要用到n=2时的策略,将A上面的两个盘子挪到B上,再将最大的盘子挪到C上,最后将B上的小盘子挪到C上就完成了所有的的步骤。例如n=3如下图:

请添加图片描述

因为A中最后处理的是最大的盘子,所以在移动的过程中不存在大盘子在小盘子上面的情况

本题的操作:

  1. 对于规模为n的问题,我们需要将A柱上的n个盘子移动到C柱上

  2. 规模为n的问题可以被拆分成规模为n-1的子问题:

    1. 将A柱上的上面n-1个盘子移动到B柱上
    2. 将A柱上的最大盘子移动到C柱上,然后B柱上的n-1个盘子移动到C柱上
  3. 当问题的规模变为n=1时,即只有一个盘子时,我们可以直接将其从A柱移动到C柱

3.2 算法流程:

递归函数设计: void dfs(vector<int>& a, vector<int>& b, vector<int>& c,int n)

  1. 返回值:无

  2. 参数:三个柱子上的盘子,当前需要处理的盘子个数(当前问题规模)

  3. 函数作用:将A中的上面n个盘子挪到C中

递归函数流程:

  1. 当前问题规模为n=1时,直接将A中最上面盘子挪到C中并返回
  2. 递归将A中最上面的n-1个盘子挪到B中
  3. 将A中最上面的一个盘子挪到C中
  4. 将B中上面n-1个盘子挪到C中

3.3 C++算法代码:

class Solution {
public:
    void hanota(vector<int>& a, vector<int>& b, vector<int>& c) {
        dfs(a,b,c,a.size());

    }
    void dfs(vector<int>& a, vector<int>& b, vector<int>& c,int n)
    {
        //如果n为1时,将a放到c上
        if(n==1)
        {
            c.push_back(a.back());
            a.pop_back();
            return;
        }
        //将a的最上面的n-1个盘子放到b上
        dfs(a,c,b,n-1);
        //将a的最后一个盘子放到c上
        c.push_back(a.back());
        a.pop_back();
        //将b的最上面的n-1个盘子放到c上
        dfs(b,a,c,n-1);
    }
   
};

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

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

相关文章

【Web】TCP 和 UCP 的含义和区别

文章目录 一、两者含义二、两者区别 一、两者含义 TCP/IP 协议组为传输层指明了两个协议&#xff1a;TCP 和 UDP&#xff0c;他们都是作为应用程序和网络操作的中介物 TCP &#xff08;传输控制协议&#xff09;&#xff1a;通过三次握手建立可靠的连接&#xff0c;发送端将数据…

Excel自学三部曲_Part3:Excel工作场景实战(二)

文章目录 二、基础概念、表格结构与常用函数1. 业务背景、字段含义2. 筛选、排序、冻结窗格3. 状态栏数据提示、调整数据显示格式4. 公式、引用、溢出5. 连接和提取函数、时间函数、IF和IFS函数、SUMIF和SUMIFS函数&#xff08;1&#xff09;每个业务组的成交额有多少&#xff…

解决使用IDEA启动SpringBoot项目报错 java: 警告: 源发行版 17 需要目标发行版 17 或者 java: 无效的目标发行版: 17

问题描述 今天新建了个SpringBoot项目&#xff0c;在启动的时候报错如下&#xff1a; java: 警告: 源发行版 17 需要目标发行版 17 分析问题 其实错误已经很明显了&#xff0c;由于我本地只有JDK8的环境&#xff0c;但是项目以及编译器的JDK是17&#xff0c;这时候把JDK版本修…

提示3D标题编辑器仍在运行如何解决 3D标题编辑器怎么使用

品牌型号&#xff1a;联想GeekPro 2020 系统&#xff1a;Windows 10 64位专业版 软件版本&#xff1a;会声会影2023旗舰版 3D标题因其独特的表现形式和多变的画面效果&#xff0c;被广泛应用于节目片头、宣传片、开幕式等诸多场景之中。掌握3D标题的使用技巧&#xff0c;能够…

SecureCRT 手动全部Tab窗口重连

在工作了一天后&#xff0c;到第二天上班的时候&#xff0c;前一天连接的服务会断开&#xff0c;因为公司内部网络自动断开了&#xff0c;所以一个个重新连接和登录 &#xff0c;用脚本轻松搞定。 # $language "VBScript" # $interface "1.0"Dim g_objTa…

数组基础知识三

二分查找法&#xff1a;也叫折半查找算法。二分查找针对的是一个有序的数据集合&#xff0c;每次都通过跟区间的中间元素对比&#xff0c;将待查找的区间缩小为之前的一半&#xff0c;直到找到要查找的元素&#xff0c;或者区间被缩小为 0。 #include <stdio.h>int main…

干了3年“点点点”,我废了...

简单概括一下 先说一下自己的情况&#xff0c;普通本科&#xff0c;18年通过校招进入深圳某软件公司&#xff0c;干了3年多的功能测试&#xff0c;21年的那会&#xff0c;因为大环境不好&#xff0c;我整个人心惊胆战的&#xff0c;怕自己卷铺盖走人了&#xff0c;我感觉自己不…

day53【子序列】1143.最长公共子序列 1035.不相交的线 53.最大子序和

文章目录 1143. 最长公共子序列1035.不相交的线53. 最大子序和 1143. 最长公共子序列 题目链接&#xff1a;力扣链接 讲解链接&#xff1a;代码随想录讲解 题意&#xff1a;给定两个字符串 text1 和 text2&#xff0c;返回这两个字符串的最长 公共子序列 的长度。如果不存在 …

C++并发编程实战——05.内存模型与原子操作

文章目录 内存模型与原子操作内存模型原子操作和原子类型标准原子类型std::atomic_flagstd::atomic\<bool>std::atomic<T\*>std::atomic<user_define_type> 类模板非成员函数 同步操作和强制排序同步发生与先行发生内存序**顺序一致性**(memory_order_seq_cs…

Java选择与循环

1.选择 前言&#xff1a;什么是选择呢&#xff1f;在我们的人生中处处面临着选择&#xff0c;比如说在学校你可以选择玩&#xff0c;摆烂&#xff0c;当然也可以选择努力写代码&#xff0c;刷题。什么样的选择就会面临什么样的结果。 其实程序和人生一样&#xff1a;顺序中夹杂…

intellij idea拉取最新的依赖包

intellij idea setting 拉取最新的依赖包 File --> Settings --> Build, Execution, Deployment --> Build Tools --> Maven --> 勾选 Always update snapshots. 一般情况下&#xff0c;设置完就可以拉取到最新的依赖包了。 如下&#xff1a; 安装最新的依赖…

计算机视觉基础——基于yolov5-face算法的车牌检测

文章目录 车牌检测算法检测实现1.环境布置2.数据处理2.1 CCPD数据集介绍2.1.1 ccpd2019及20202.1.2 文件名字解析 2.2数据集处理2.2.1 CCPD数据处理2.2.2 CPRD数据集处理 2.3 检测算法2.3.1 数据配置car_plate.yaml2.3.2 模型配置2.3.3 train.py2.3.4 训练结果 2.4 部署2.4.1 p…

activiti的核心对象与API与对应操作的表与核心字段

【Deployment】 &#xff08;创建并部署一个新的流程定义&#xff09; 获取方式&#xff1a; repositoryService.createDeployment().deploy(); 对应的表&#xff1a;act_re_deployment 用于存储流程部署的相关信息。该表记录了每个流程部署的唯一标识符&#xff08;ID&#x…

【Redis】Redis在Linux与windows上的安装基本操作语法

一、Redis简介 Redis 是完全开源免费的&#xff0c;遵守BSD协议&#xff0c;是一个高性能的key-value数据库。 Redis 与其他 key - value 缓存产品有以下三个特点&#xff1a; Redis支持数据的持久化&#xff0c;可以将内存中的数据保持在磁盘中&#xff0c;重启的时候可以再…

Python条件判断的运用

问题 在生活中&#xff0c;我们可以通过判断条件是否成立&#xff0c;来决定执行哪个分支。选择语句有多种形式&#xff1a;if语句&#xff0c;if-else语句&#xff0c;if-elif-else语句等。 Python使用if条件判断语句来实现条件判断时&#xff0c;可以在多个循环中实现对问题的…

【蓝桥杯 第十四届省赛Java B组】真题训练(A - C)正在更新

目录 A、阶乘求和 - BigInteger B、幸运数字 - 字符串 进制转换 暴力大法 C、数组分割 - A、阶乘求和 - BigInteger 思路&#xff1a; 当时比赛时&#xff0c;拿计算器算的&#xff0c;然后辛辛苦苦也没对 看到这个数肯定很大&#xff0c;而且只求后9位&#xff0c;阶乘越…

三篇文章了解计算机网络(一)

目标 三篇文章&#xff0c;由浅入深理解计算机网络 适宜人群 小小白、无计算机网络基础&#xff0c;非技术人员&#xff0c;网络兴趣爱好者 内容简介 本文不谈技术&#xff0c;不谈理论&#xff0c;那谈什么&#xff1f;--谈生活。。。跑题了&#xff1f; 正文 网络是什…

SECS/GEN HSMS半导体通信协议解析

协议族总体结构 HSMS消息格式&#xff08;网口连接&#xff09; 超时时间设置 T3 回复超时&#xff1a;指发送指令到接收到回复指令的最大时间&#xff1b; T5 连接间隔&#xff1a;指断开连接和重新连接的最小时间&#xff1b; T6 控制指令超时时间&#xff1a;主要指连接选…

本地部署清华大模型 ChatGLM3

ChatGLM 是一个开源的、支持中英双语的对话语言模型&#xff0c;由智谱 AI 和清华大学 KEG 实验室联合发布&#xff0c;基于 General Language Model (GLM) 架构&#xff0c;具有 62 亿参数。ChatGLM3-6B 更是在保留了前两代模型对话流畅、部署门槛低等众多优秀特性的基础上增加…

读程序员的制胜技笔记02_算法与数据结构

1. 认知偏见 1.1. 程序员也是人&#xff0c;他们和其他人在软件开发实践中有着同样的认知偏见 1.2. 只有你的同事真正关心你是如何做事的——其他人都只想要一个好的、有效的产品 1.3. 高估了不使用的类型 1.4. 不关心正确数据结构的好处 1.5. 认为算法只对库作者重要 2.…