《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

From Pixels to Numbers: A Deep Dive into ISBN Recognition with OpenCV and C++

从像素到数字:基于OpenCV与C++的ISBN识别系统深度解析 1. 项目背景与核心挑战 在数字化浪潮席卷各行各业的今天,自动识别技术已成为连接物理世界与数字世界的重要桥梁。ISBN(国际标准书号)作为图书的唯一身份标识,其自动识别在图书馆管理、智能零售、出版发行等领域具有广泛应用价值。然而,传统OCR技术面对复杂背景、光照变化和倾斜变形等现实场景时,识别准确率往往难以满足实际需求。 本项目基于OpenCV和C++构建了一套完整的ISBN识别系统,通过精心设计的图像处理流水线,实现了从原始图像到数字编码的精准提取。系统在Visual Studio环境下开发,主要解决以下核心挑战: * 复杂背景干扰:图书封面通常包含丰富的色彩和图案 * 光照条件多变:不同环境下的亮度对比度差异显著 * 几何形变问题:拍摄角度导致的透视变形和旋转 * 字符分割困难:连笔、断笔等印刷质量问题 2. 技术架构与处理流程 2.1 系统整体架构 系统采用模块化设计,主要包含以下核心组件: class detectSolution { private: // 图像处理相关成员变量 Ma

By Ne0inhk
【C++STL】map与set(举例+详解,一文说懂)!

【C++STL】map与set(举例+详解,一文说懂)!

🌟个人主页:第七序章   🌈专栏系列:C++ 目录 ❄️前言: 一、☀️序列式容器与关联式容器 二、☀️键值对 三、☀️树形结构的关联式容器 四、☀️set 4.1 🌙set介绍  4.2 🌙set的构造和迭代器 4.3 🌙set的增删查 4.4 🌙insert和迭代器遍历使用样例  4.5 🌙find和erase使用样例 4.6 🌙multiset和set的差异 4.7 🌙set相关题目练习 五、☀️multiset 5.1 🌙multiset介绍 5.2 🌙multiset使用 六、☀️map 6.1 🌙map介绍 6.2

By Ne0inhk
《C++进阶之STL》【set/map 模拟实现】

《C++进阶之STL》【set/map 模拟实现】

【set/map 模拟实现】目录 * 前言: * ------------标准介绍------------ * 1. 标准库中的set/map是怎么实现的呢? * 2. 为什么需要两个模板参数(Key & Value)? * ------------模拟实现------------ * 头文件: * RBTree.h * Myset.h * Mymap.h * 测试文件:Test.cpp * 运行结果 * ------------基本操作------------ * 一、前置++操作 * 1. 本质 * 2. 步骤 * 3. 图示 * 4. 解释 * 二、前置--操作 * 1. 本质 * 2. 步骤 * 3. 图示 * 4. 解释 * ------------代码解释------------ * 片段一:

By Ne0inhk
C++分布式语音识别服务实践

C++分布式语音识别服务实践

基于 brpc+etcd + 百度 AI SDK 的分布式语音识别服务实践:从代码架构到踩坑复盘 一、项目背景与核心功能 最近基于 C++ 实现了一个分布式语音识别子服务,核心目标是提供高可用的 RPC 接口,支持客户端上传 PCM 音频文件并返回识别结果。技术栈选型如下: * RPC 框架:brpc(百度开源高性能 RPC 框架,支持多种协议); * 数据序列化:Protobuf(定义 RPC 接口和数据结构); * 服务注册与发现:etcd(分布式键值存储,实现服务上下线感知); * 语音识别能力:百度 AI 语音 SDK(提供成熟的 PCM 音频转文字能力); * 日志与配置:spdlog(高性能日志库)、gflags(命令行参数解析)。 项目分为服务端和客户端两部分:

By Ne0inhk