《C++ 递归、搜索与回溯》第1题:汉诺塔问题

《C++ 递归、搜索与回溯》第1题:汉诺塔问题

🔥个人主页:Cx330🌸

❄️个人专栏:《C语言》《LeetCode刷题集》《数据结构-初阶》《C++知识分享》

《优选算法指南-必刷经典100题》《Linux操作系统》:从入门到入魔

《Git深度解析》:版本管理实战全解

🌟心向往之行必能至


🎥Cx330🌸的简介:


前言:

聚焦算法题实战,系统讲解三大核心板块:“精准定位最优解”——优选算法,“简化逻辑表达,系统性探索与剪枝优化”——递归与回溯,“以局部最优换全局高效”——贪心算法,讲解思路与代码实现,帮助大家快速提升代码能力

目录

前言:

递归,搜索与回溯算法前置知识

1. 汉诺塔

算法原理(递归):

思路:

算法流程:

解法代码(C++):

博主手记(字体还请见谅哈):

结尾:


递归,搜索与回溯算法前置知识

1. 汉诺塔

题目链接:

面试题 08.06. 汉诺塔问题 - 力扣(LeetCode)

题目描述:

题目示例:

算法原理(递归):

思路:

这是一道递归方法的经典题目,我们可以先从最简单的情况考虑:

  • 假设 n=1 ,只有一个盘子,很简单,直接把它从A中拿出来,移到C上;
  • 如果 n=2呢?这时候我们就要借助 B 了,因为先盘子必须时刻都在大盘子上面,共需要3步(为了方便叙述,记A中的盘子从上到下为 1号,2号)
    • 1号盘子放到 B 上
    • 2号盘子放到 C上
    • 3号盘子放到 C 上
      至此,C中的盘子从上到下为 1号,2号。
  • 如果 n>2 呢?这时我们需要用到 n=2 时的策略,将A上面的两个盘子挪到 B 上,再将最大的盘子挪到 C 上 ,最后将 B 上的小盘子挪到 C 上就完成了所有步骤。假如 n=3 时如下图:

因为 A 中最后处理的是最大的盘子,所以在移动过程中不存在大盘子在小盘子上的情况。
则本题可以解释为:

  • 对于规模为 n 的问题,我们需要将 A 柱上的 n 个盘子移动到C柱上。
  • 规模为 n 的问题可以被拆分为规模为 n-1 的子问题:
    • a.将 A 柱上的上面 n-1 个盘子移动到B柱上。
    • b.将 A 柱上的最大盘子移动到 C 柱上,然后将 B 柱上的 n-1 个盘子移动到C柱上。
  • 当问题的规模变为 n=1 时,即只有⼀个盘子时,我们可以直接将其从 A 柱移动到 C 柱
  • 需要注意的是,步骤 2.b 考虑的是总体问题中的 子问题b 情况。在处理子问题的子问题b 时,我们应该将 A 柱中的最上面的盘子移动到 C 柱,然后再将 B 柱上的盘子移动到 C 柱。在处理总体问题的子问题b 时,A 柱中的最大盘子仍然是最上面的盘子,因此这种做法是通用的
算法流程:

递归函数设计:void hanotaa(vector& A, vector& B, vector& C, int n)

  • 返回值:无;
  • 参数:三个柱子上的盘子,当前需要处理的盘子个数(当前问题规模)。
  • 函数作用:将 A 中的上面 n 个盘子挪到 C 中

递归函数流程:

  • 当前问题规模为 n=1 时,直接将 A 中的最上面盘子挪到 C 中并返回
  • 递归将 A 中最上面的 n-1 个盘子挪到 B 中;
  • 将 A 中最上面的⼀个盘子挪到 C 中;
  • 将 B 中上面 n-1 个盘子挪到 C 中
解法代码(C++):
class Solution { public: void dfs(vector<int>& A, vector<int>& B, vector<int>& C,int n) { if(n==1) { C.push_back(A.back()); A.pop_back(); return; } dfs(A,C,B,n-1); C.push_back(A.back()); A.pop_back(); dfs(B,A,C,n-1); } void hanota(vector<int>& A, vector<int>& B, vector<int>& C) { int n=A.size(); dfs(A,B,C,n); } };
博主手记(字体还请见谅哈):

结尾:

汉诺塔问题的递归解法,通过分解问题规模,将n个盘子的移动转化为n-1个子问题。算法核心是将A柱的n-1个盘子暂存B柱,移动最大盘子到C柱,再将B柱盘子移到C柱。并强调递归终止条件(n=1时直接移动),展示了递归思想在经典算法问题中的应用

Read more

Java 接口:从‘空架子’到‘万能遥控器’

🚀Java接口通关秘籍:从“空架子”到“万能遥控器”的逆袭! 发布时间:2026-01-09 专栏:Java基础通关指南 😮 先唠个嗑:为啥接口总被新手“嫌弃”? 刚学Java的小伙伴大概率都有这感受:“接口这玩意儿啥也干不了,就一堆空方法,写了半天还得靠实现类干活,纯纯的‘空架子’?” NONONO!今天咱就把Java接口的底裤扒干净——它不是“空架子”,而是编程界的“万能遥控器”:定义好了按钮(方法),不管是电视、空调还是投影仪(实现类),只要按规矩接这个遥控器,就能按统一的方式干活! 📚 一、啥是Java接口?(人话版解释) 1. 官方定义(快速略过) 接口(Interface)是Java中的一种引用类型,是方法的集合,只能包含常量、抽象方法(Java 8前),以及默认方法、静态方法、私有方法(Java

By Ne0inhk
Java 大视界 -- Java 大数据平台迁移与升级策略:平滑过渡的方法(十四)

Java 大视界 -- Java 大数据平台迁移与升级策略:平滑过渡的方法(十四)

💖💖💖亲爱的朋友们,热烈欢迎你们来到 青云交的博客!能与你们在此邂逅,我满心欢喜,深感无比荣幸。在这个瞬息万变的时代,我们每个人都在苦苦追寻一处能让心灵安然栖息的港湾。而 我的博客,正是这样一个温暖美好的所在。在这里,你们不仅能够收获既富有趣味又极为实用的内容知识,还可以毫无拘束地畅所欲言,尽情分享自己独特的见解。我真诚地期待着你们的到来,愿我们能在这片小小的天地里共同成长,共同进步。💖💖💖 本博客的精华专栏: 1. 大数据新视界专栏系列:聚焦大数据,展技术应用,推动进步拓展新视野。 2. Java 大视界专栏系列(NEW):聚焦 Java 编程,涵盖基础到高级,展示多领域应用,含性能优化等,助您拓宽视野提能力 。 3. Java 大厂面试专栏系列:提供大厂面试的相关技巧和经验,助力求职。 4. Python 魅力之旅:探索数据与智能的奥秘专栏系列:走进 Python 的精彩天地,感受数据处理与智能应用的独特魅力。 5. Java

By Ne0inhk
计算机毕业设计springboot博物馆藏品管理系统 基于Java的博物馆文物数字化保管平台 智慧博物馆馆藏资源信息管理系统

计算机毕业设计springboot博物馆藏品管理系统 基于Java的博物馆文物数字化保管平台 智慧博物馆馆藏资源信息管理系统

计算机毕业设计springboot博物馆藏品管理系统9cqv9q2e(配套有源码 程序 mysql数据库 论文) 本套源码可以在文本联xi,先看具体系统功能演示视频领取,可分享源码参考。 博物馆作为文化遗产的核心守护者,承担着收藏、研究、展示和教育等多重使命。随着馆藏数量持续增长与品类日益繁杂,传统手工记录与物理存储模式已难以满足现代管理对效率、精准度及便捷性的硬性需求。与此同时,公众文化服务需求不断升级,观众不仅期待获取详尽的文物信息,更渴望通过数字化互动深度参与文化体验。在此背景下,利用现代信息技术重构博物馆管理流程,推动藏品管理从纸质化向数字化转型,已成为提升管理科学性、优化公共服务能力的必然选择。 本系统采用SpringBoot框架与Vue.js技术构建,遵循B/S架构设计,通过MySQL数据库实现数据持久化。系统功能模块覆盖博物馆日常运营与公众服务的全流程业务场景:在基础数据管理方面,实现博物馆简介信息(场馆名称、地址、规模、负责人、联系方式、开放时间、发展历程及展示图片)的维护;在核心藏品管理方面,涵盖藏品展览与精品典藏两大子系统,支持藏品基础信息(名称、类型、年代

By Ne0inhk
Java刷题常见的集合类,各种函数的使用以及常见的类型转化等等

Java刷题常见的集合类,各种函数的使用以及常见的类型转化等等

目录 前言 集合类 ArrayList 1. 创建和初始化 ArrayList 2.添加元素  add 3.获取元素 get 4.删除元素 remove 5.检查元素  6.遍历 ArrayList LinkedList Stack 1. 创建Stack对象 2. 压入元素 (push)   3. 弹出元素 (pop)  4. 查看栈顶元素 (peek)  5. 检查栈是否为空 (empty) Queue 1. 创建队列对象 2. 添加元素 (add 和 offer)   3. 移除元素 (poll 和 remove)

By Ne0inhk