当前位置: 首页 > news >正文

【C++】青蛙跳跃问题解析与解法


在这里插入图片描述

博客主页: [小ᶻ☡꙳ᵃⁱᵍᶜ꙳]
本文专栏: C++

文章目录

  • 💯前言
  • 💯题目描述
    • 第一部分:基本青蛙过河问题
    • 第二部分:石柱和荷叶问题
  • 💯解题思路与分析
    • 第一部分:青蛙过河问题
      • 解法思路:递归拆解
    • 第二部分:最多能跳多少只青蛙
      • 思路与公式推导
  • 💯代码实现
    • 递归函数实现
    • 示例输出
  • 💯递归的理解与优化
    • 优化思路
  • 💯小结


在这里插入图片描述


💯前言

  • 青蛙跳跃问题是一道经典的递归与路径优化题目,考察了递归思维问题分解能力以及逻辑推理能力。在本篇文章中,我们将详细分析题目的背景、题目规则、解决方案、代码实现以及优化思路。
    通过逐步拆解问题和总结规律,帮助读者深入理解递归的本质以及其在路径问题中的应用。本文不仅关注基本解法,还会深入探讨题目的扩展性和优化空间,力求帮助读者掌握这种递归思维在实际问题中的应用。
    C++ 参考手册
    在这里插入图片描述

💯题目描述

本题分为两个部分,分别如下:


第一部分:基本青蛙过河问题

题目背景

(2000年全国青少年信息学奥林匹克试题)

一条小溪尺寸不大,青蛙可以从左岸跳到右岸。在左岸有一石柱 L,面积只容得下一只青蛙落脚;同样,右岸也有一石柱 R,面积也只容得下一只青蛙落脚。有一队青蛙从尺寸上一个比一个小。我们将青蛙从小到大,用 1, 2, …, n 编号。

要求

  1. 初始时青蛙只能跳到左岸的石柱 L 上,按编号一个落一个,小的青蛙落在大的青蛙上面。不允许大的在小的上面
  2. 将所有青蛙从 L 移动到 R,保持大小顺序不变。

分析重点
这个问题与经典的汉诺塔问题极其相似,可以通过递归来解决。我们需要借助中间的石柱或荷叶,逐步将青蛙从左岸移动到右岸。


第二部分:石柱和荷叶问题

新增规则

  1. 青蛙从左岸 L 跳出后,不允许再跳回左岸。
  2. 青蛙跳到右岸 R 或中途的荷叶/石柱后,也不能再离开。

已知条件

  • 溪中有 ( s ) 根石柱和 ( y ) 片荷叶。

目标:求 最多能跳过多少只青蛙


💯解题思路与分析


第一部分:青蛙过河问题

这个问题的解决思路与 汉诺塔问题 极其相似。汉诺塔问题是一种经典的递归问题,通过将盘子逐个移动来达到最终目标。在青蛙过河问题中,我们将递归思想进行迁移,借助中间位置完成青蛙的转移。

解法思路:递归拆解

  1. 基本思路:将青蛙分为两部分。

    • 先将 ( n-1 ) 只青蛙从 L 移动到辅助位置(荷叶/石柱)。
    • 然后将第 ( n ) 只青蛙直接从 L 移动到 R
    • 最后将 ( n-1 ) 只青蛙从辅助位置移动到 R
  2. 递归关系可以总结为:
    T ( n ) = 2 ⋅ T ( n − 1 ) + 1 T(n) = 2 \cdot T(n-1) + 1 T(n)=2T(n1)+1
    其中 ( T(n) ) 是将 ( n ) 只青蛙移动到右岸所需的最少步数。

  3. 递归终止条件:当只剩下一只青蛙时,直接将其移动到目标位置。这一步与汉诺塔的最小子问题完全一致,青蛙跳到终点即可。

  4. 路径可视化
    递归的核心在于分解问题。可以通过树形结构将每一步的移动过程展示出来,使得解法更加清晰直观。


第二部分:最多能跳多少只青蛙


思路与公式推导

新增了 石柱荷叶 后,溪中的路径可以看作是多次跳跃的落脚点。题目要求青蛙跳到这些落脚点后不能再移动,问题变为:

  • 每次增加一个石柱时,路径数量会 翻倍
  • 荷叶提供了额外的停留点。

关键分析

  1. 当 ( s = 0 )(无石柱)时,最多能跳过的青蛙数量为:
    k = y + 1 k = y + 1 k=y+1
    其中 ( y ) 是荷叶数量,右岸 ( R ) 也算一个位置。
  2. 当 ( s > 0 )(有石柱)时,每增加一根石柱,路径会 翻倍,满足以下递归关系:
    k = 2 ⋅ e x t J u m p ( s − 1 , y ) k = 2 \cdot ext{Jump}(s-1, y) k=2extJump(s1,y)
  3. 最终递归公式可以总结为:
    k = 2 s ⋅ ( y + 1 ) k = 2^s \cdot (y + 1) k=2s(y+1)
    其中:
    • ( s ) 是石柱数。
    • ( y ) 是荷叶数。
    • ( 2^s ) 表示路径翻倍的次数。

💯代码实现


递归函数实现

#include <iostream>
using namespace std;// 递归函数:计算最多能跳过多少只青蛙
int Jump(int s, int y) {int k = 0; // 结果变量if (s == 0) // 递归终止条件k = y + 1; // 没有石柱,直接加上荷叶数和右岸elsek = 2 * Jump(s - 1, y); // 每增加一根石柱,路径翻倍return k; // 返回结果
}int main() {int s, y; // 定义变量cout << "请输入溪中的石柱数 s 和荷叶数 y:" << endl;cin >> s >> y; // 输入石柱数和荷叶数int result = Jump(s, y); // 调用函数cout << "最多能跳过的青蛙数为:" << result << endl; // 输出结果return 0;
}

在这里插入图片描述


示例输出

假设输入:

请输入溪中的石柱数 s 和荷叶数 y:
3 2

程序输出:

最多能跳过的青蛙数为:24

验证
根据公式 ( k = 2^s \cdot (y + 1) ):

  • ( s = 3 ),( y = 2 ):
    k = 2 3 ⋅ ( 2 + 1 ) = 8 ⋅ 3 = 24 k = 2^3 \cdot (2 + 1) = 8 \cdot 3 = 24 k=23(2+1)=83=24

💯递归的理解与优化

递归是一种通过将大问题分解为小问题逐步解决的方法。在本题中:

  • 终止条件:当 ( s = 0 ) 时,直接求解。
  • 递归关系:路径翻倍,通过 ( k = 2 \cdot Jump(s-1, y) ) 实现。

优化思路

如果问题规模较大(例如 ( s ) 很大),递归会占用较多栈空间。可以使用 迭代法 替代递归,将结果逐步累积:

int JumpIterative(int s, int y) {int k = y + 1; // 初始值,当 s = 0 时for (int i = 0; i < s; ++i) {k *= 2; // 每增加一根石柱,路径翻倍}return k;
}

💯小结

  • 在这里插入图片描述
    通过本题,我们深入理解了递归的本质和路径问题的解法:
  1. 青蛙过河问题汉诺塔问题 类似,通过递归分解问题逐步求解。
  2. 石柱和荷叶问题 中,路径数量随着石柱数 ( s ) 指数级增长,满足公式:
    k = 2 s ⋅ ( y + 1 ) k = 2^s \cdot (y + 1) k=2s(y+1)
  3. 提供了递归和迭代两种解法,递归结构清晰,迭代更高效。
  4. 通过图示和示例输出,直观展示了问题的解决过程。

掌握这类问题的解法,有助于培养递归思维和问题分解能力,为解决更复杂的算法问题打下坚实的基础。这类问题也为动态规划和搜索算法提供了重要的学习基础。


在这里插入图片描述


在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述

相关文章:

【C++】青蛙跳跃问题解析与解法

博客主页&#xff1a; [小ᶻ☡꙳ᵃⁱᵍᶜ꙳] 本文专栏: C 文章目录 &#x1f4af;前言&#x1f4af;题目描述第一部分&#xff1a;基本青蛙过河问题第二部分&#xff1a;石柱和荷叶问题 &#x1f4af;解题思路与分析第一部分&#xff1a;青蛙过河问题解法思路&#xff1a;递…...

自动驾驶AVM环视算法--python版本的俯视TOP投影模式

c语言版本和算法原理的可以查看本人的其他文档。《自动驾驶AVM环视算法--全景的俯视图像和原图》本文档进用于展示部分代码的视线&#xff0c;获取方式网盘自行获取&#xff08;非免费介意勿下载&#xff09;&#xff1a;链接: https://pan.baidu.com/s/1MJa8ZCEfNyLc5x0uVegto…...

Go 语言与时间拳击理论下的结对编程:开启高效研发编程之旅

一、引言 结对编程作为一种软件开发方法&#xff0c;在提高代码质量、增强团队协作等方面具有显著优势。而时间拳击理论为结对编程带来了新的思考角度。本文将以 Go 语言为中心&#xff0c;深入探讨时间拳击理论下的结对编程。 在当今软件开发领域&#xff0c;高效的开发方法和…...

Qt+OPC开发笔记(一):OPCUA介绍、open62541介绍、编译与基础环境Demo

若该文为原创文章&#xff0c;转载请注明原文出处 本文章博客地址&#xff1a;https://hpzwl.blog.csdn.net/article/details/144516882 长沙红胖子Qt&#xff08;长沙创微智科&#xff09;博文大全&#xff1a;开发技术集合&#xff08;包含Qt实用技术、树莓派、三维、OpenCV…...

ElasticSearch 常见故障解析与修复秘籍

文章目录 一、ElasticSearch启动服务提示无法使用root用户二、ElasticSearch启动提示进程可拥有的虚拟内存少三、ElasticSearch提示用户拥有的可创建文件描述符太少四、ElasticSearch集群yellow状态分析五、ElasticSearch节点磁盘使用率过高&#xff0c;read_only状态问题解决六…...

序列模型的使用示例

序列模型的使用示例 1 RNN原理1.1 序列模型的输入输出1.2 循环神经网络&#xff08;RNN&#xff09;1.3 RNN的公式表示2 数据的尺寸 3 PyTorch中查看RNN的参数4 PyTorch中实现RNN&#xff08;1&#xff09;RNN实例化&#xff08;2&#xff09;forward函数&#xff08;3&#xf…...

对rust的全局变量使用drop方法

文章目录 rust处理全局变量的策略方法1&#xff1a;在main中自动Drop全局变量 参考 rust处理全局变量的策略 Rust 的静态变量不会在程序退出时自动调用 Drop&#xff0c;因为它们的生命周期与进程绑定。 use std::sync::OnceLock;struct GlobalData {content: String, }impl …...

Node.js教程入门第一课:环境安装

对于一个程序员来说&#xff0c;每学习一个新东西的时候&#xff0c;第一步基本上都是先进行环境的搭建&#xff01; 从本章节开始让我们开始探索Node.js的世界吧! 什么是Node.js? 那么什么是Node.js呢&#xff1f;简单的说Node.js 就是运行在服务端的 JavaScript JavaScript…...

Visual Studio 使用 GitHub Copilot 扩展

&#x1f380;&#x1f380;&#x1f380;【AI辅助编程系列】&#x1f380;&#x1f380;&#x1f380; Visual Studio 使用 GitHub Copilot 与 IntelliCode 辅助编码Visual Studio 安装和管理 GitHub CopilotVisual Studio 使用 GitHub Copilot 扩展Visual Studio 使用 GitHu…...

【Qualcomm】IPQ5018获取TR069 WiFi 接口Stats状态方法

IPQ5018 简介 IPQ5018 是高通(Qualcomm)公司推出的一款面向网络设备的系统级芯片(SoC)。它通常用于路由器、接入点和其他网络设备中,提供高性能的无线网络连接。以下是关于 IPQ5018 的一些关键特性和功能: 关键特性 高性能处理器 IPQ5018 集成了多核 CPU,通常是 ARM …...

数字营销咨询,照亮企业营销数字化每一步

在快消品领域&#xff0c;面对市场竞争日益激烈的现状&#xff0c;营销端的数字化升级已经成为企业生意增长的重要驱动力。 然而&#xff0c;鉴于营销端数字化建设的高昂成本及其广泛覆盖的业务范畴&#xff0c;企业在启动此类项目之前&#xff0c;通常会遭遇一系列挑战与顾虑&…...

修改vscode中emmet中jsx和tsx语法中className的扩展符号从单引号到双引号 - HTML代码补全 - 单引号双引号

效果图 实现步骤 文件 > 首选项 > 设置搜索“”在settings.json中修改&#xff0c;增加 "emmet.syntaxProfiles": {"html": {"attr_quotes": "single"},"jsx": {"attr_quotes": "double","…...

【Cmake】

1 设置安装路径 -DCMAKE_INSTALL_PREFIX"安装路径"2 使用交叉编译 -DCMAKE_C_COMPILE"交叉编译器绝对路径"3 编译静态库 -DPAHO_BUILD_STARTTRUE...

Flutter 内嵌 unity3d for android

前言&#xff1a; 最近刚整完 unity3d hybridCLR 更新代码和资源&#xff0c;我们 趁热打铁 将 Unity3D 嵌入 Flutter 应用中。实现在 Flutter 使用 Unity3D, 可以做 小游戏 大游戏&#xff1b; 之前都是 内嵌 Webview 来实现的。虽然 CocosCreator 做出来的效果也不错&#xf…...

sqlite加密-QtCipherSqlitePlugin 上

1、下载并解压软件 https://download.csdn.net/download/notfindjob/90140129 2、编译&#xff08;可支持Qt5.12编译&#xff09; 3、安装插件...

正交投影 (Orthographic Projection) 详解

正交投影 (Orthographic Projection) 详解 正交投影是一种将三维空间中的物体投影到二维平面上的方法&#xff0c;它在计算机图形学、建筑设计、工程绘图等领域中广泛应用。与透视投影不同&#xff0c;正交投影不会随着距离的变化而改变物体的大小&#xff0c;因此所有平行线在…...

盛元广通畜牧与水产品检验技术研究所LIMS系统

一、系统概述 盛元广通畜牧与水产品检验技术研究所LIMS系统集成了检测流程管理、样品管理、仪器设备管理、质量控制、数据记录与分析、合规性管理等功能于一体&#xff0c;能够帮助实验室实现全流程的数字化管理。在水产、畜牧产品的质检实验室中&#xff0c;LIMS系统通过引入…...

三维空间刚体运动4-1:四元数表示变换(各形式相互转换加代码——下篇)

三维空间刚体运动4-1&#xff1a;四元数表示变换&#xff08;各形式相互转换加代码——下篇&#xff09; 4. 四元数到其它旋转表示的相互转换4.1 旋转向量4.2 旋转矩阵4.3 欧拉角4.3.1 转换关系4.3.2 转换中的万象锁问题 5. 四元数的其他性质5.1 旋转的复合5.2 双倍覆盖5.3 指数…...

PyTorch如何通过 torch.unbind 和torch.stack动态调整张量的维度顺序

笔者一篇博客PyTorch 的 torch.unbind 函数详解与进阶应用&#xff1a;中英双语中有一个例子如下&#xff1a; # 创建一个 3x2x2 的三维张量 x torch.tensor([[[1, 2], [3, 4]],[[5, 6], [7, 8]],[[9, 10], [11, 12]]])# 第一步&#xff1a;沿第 0 维分解为 3 个 2x2 张量 un…...

【Unity3D】报错libil2cpp.so找不到问题

mainTemplate.gradle文件末尾添加&#xff1a; **IL_CPP_BUILD_SETUP** 此报错发生在低版本的Unity升级到高版本后&#xff0c;例如Unity2019升级到Unity2021&#xff0c;而Unity2019默认创建的mainTemplate.gradle文件是不包含**IL_CPP_BUILD_SETUP** 因此会导致libil2cpp.so…...

python/java环境配置

环境变量放一起 python&#xff1a; 1.首先下载Python Python下载地址&#xff1a;Download Python | Python.org downloads ---windows -- 64 2.安装Python 下面两个&#xff0c;然后自定义&#xff0c;全选 可以把前4个选上 3.环境配置 1&#xff09;搜高级系统设置 2…...

python爬虫:Newspaper3k 的详细使用(好用的新闻网站文章抓取和解析的Python库)

更多内容请见: 爬虫和逆向教程-专栏介绍和目录 文章目录 一、Newspaper3k 概述1.1 Newspaper3k 介绍1.2 主要功能1.3 典型应用场景1.4 安装二、基本用法2.2 提取单篇文章的内容2.2 处理多篇文档三、高级选项3.1 自定义配置3.2 分析文章情感四、实战案例4.1 构建新闻摘要聚合器…...

python如何将word的doc另存为docx

将 DOCX 文件另存为 DOCX 格式&#xff08;Python 实现&#xff09; 在 Python 中&#xff0c;你可以使用 python-docx 库来操作 Word 文档。不过需要注意的是&#xff0c;.doc 是旧的 Word 格式&#xff0c;而 .docx 是新的基于 XML 的格式。python-docx 只能处理 .docx 格式…...

【C语言练习】080. 使用C语言实现简单的数据库操作

080. 使用C语言实现简单的数据库操作 080. 使用C语言实现简单的数据库操作使用原生APIODBC接口第三方库ORM框架文件模拟1. 安装SQLite2. 示例代码:使用SQLite创建数据库、表和插入数据3. 编译和运行4. 示例运行输出:5. 注意事项6. 总结080. 使用C语言实现简单的数据库操作 在…...

Angular微前端架构:Module Federation + ngx-build-plus (Webpack)

以下是一个完整的 Angular 微前端示例&#xff0c;其中使用的是 Module Federation 和 npx-build-plus 实现了主应用&#xff08;Shell&#xff09;与子应用&#xff08;Remote&#xff09;的集成。 &#x1f6e0;️ 项目结构 angular-mf/ ├── shell-app/ # 主应用&…...

嵌入式学习笔记DAY33(网络编程——TCP)

一、网络架构 C/S &#xff08;client/server 客户端/服务器&#xff09;&#xff1a;由客户端和服务器端两个部分组成。客户端通常是用户使用的应用程序&#xff0c;负责提供用户界面和交互逻辑 &#xff0c;接收用户输入&#xff0c;向服务器发送请求&#xff0c;并展示服务…...

jmeter聚合报告中参数详解

sample、average、min、max、90%line、95%line,99%line、Error错误率、吞吐量Thoughput、KB/sec每秒传输的数据量 sample&#xff08;样本数&#xff09; 表示测试中发送的请求数量&#xff0c;即测试执行了多少次请求。 单位&#xff0c;以个或者次数表示。 示例&#xff1a;…...

uni-app学习笔记三十五--扩展组件的安装和使用

由于内置组件不能满足日常开发需要&#xff0c;uniapp官方也提供了众多的扩展组件供我们使用。由于不是内置组件&#xff0c;需要安装才能使用。 一、安装扩展插件 安装方法&#xff1a; 1.访问uniapp官方文档组件部分&#xff1a;组件使用的入门教程 | uni-app官网 点击左侧…...

算法刷题-回溯

今天给大家分享的还是一道关于dfs回溯的问题&#xff0c;对于这类问题大家还是要多刷和总结&#xff0c;总体难度还是偏大。 对于回溯问题有几个关键点&#xff1a; 1.首先对于这类回溯可以节点可以随机选择的问题&#xff0c;要做mian函数中循环调用dfs&#xff08;i&#x…...

【Java】Ajax 技术详解

文章目录 1. Filter 过滤器1.1 Filter 概述1.2 Filter 快速入门开发步骤:1.3 Filter 执行流程1.4 Filter 拦截路径配置1.5 过滤器链2. Listener 监听器2.1 Listener 概述2.2 ServletContextListener3. Ajax 技术3.1 Ajax 概述3.2 Ajax 快速入门服务端实现:客户端实现:4. Axi…...