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

跳跃游戏(二):DFS 求解最少跳跃次数与最优路径

题目描述

给定一个非负整数数组 nums,数组中每个元素代表在该位置可以跳跃的最大长度。要求找出从数组起始位置(下标 0)跳到最后一个位置(下标 nums.size() - 1)的最少跳跃次数,并输出对应的最优跳跃过程(如示例中的 0->1->4 表示从下标 0 跳到 1,再从 1 跳到 4)。

解题思路

采用深度优先搜索(DFS)的思路,从起始位置开始,尝试所有可能的跳跃步数,递归探索每一条可能的路径,同时记录跳跃次数和路径。当到达或超过最后一个位置时,更新最少跳跃次数和对应的最优路径。

核心逻辑

  1. 递归探索:从当前位置 i 出发,尝试跳跃 1 到 nums[i] 步,递归进入下一个位置 next
  2. 路径与次数更新:每进入一个位置,将其加入当前路径;当到达终点时,若当前跳跃次数更少,则更新最少次数和最优路径。
  3. 回溯:探索完当前位置的所有可能跳跃后,将当前位置从路径中移除,回溯以探索其他可能路径。

代码实现

#include <iostream>
#include <vector>
#include <climits>
using namespace std;// 存储最优跳跃路径
vector<int> best_path;
// 最少跳跃次数,初始化为整型最大值
int min_jumps = INT_MAX;
// 存储跳跃数组
vector<int> nums;// 深度优先搜索函数
// i:当前位置;cnt:已跳跃次数;path:当前路径
void dfs(int i, int cnt, vector<int>& path) {// 将当前位置加入路径path.push_back(i);// 终止条件:到达或超过最后一个位置if (i >= nums.size() - 1) {// 若当前跳跃次数更少,更新最少次数和最优路径if (cnt < min_jumps) {min_jumps = cnt;best_path = path;}// 回溯,移除当前位置path.pop_back();return;}// 尝试从当前位置跳出的所有可能步数for (int j = 1; j <= nums[i]; j++) {int next = i + j;// 防止越界,直接跳到终点if (next >= nums.size()) {next = nums.size() - 1;}dfs(next, cnt + 1, path);  // 递归探索下一个位置}// 回溯,移除当前位置(所有子路径探索完后)path.pop_back();
}int main() {int n;cin >> n;nums.resize(n);for (int i = 0; i < n; i++) {cin >> nums[i];}vector<int> current_path;  // 记录当前递归路径dfs(0, 0, current_path);// 输出最少跳跃次数和最优路径cout << min_jumps << " ";for (int i = 0; i < best_path.size(); i++) {if (i > 0) {cout << "->";  // 路径中位置间用->连接}cout << best_path[i];}cout << endl;return 0;
}

代码解释

  • 全局变量best_path 存储最优路径,min_jumps 记录最少跳跃次数,nums 存储输入的跳跃数组。
  • dfs 函数
    • 每次进入函数先将当前位置 i 加入路径 path
    • 若到达终点,判断是否更新最少次数和最优路径,然后回溯。
    • 遍历当前位置可跳跃的步数,递归探索下一个位置,探索完所有子路径后回溯。
  • main 函数
    • 读取输入的数组长度和数组元素。
    • 调用 dfs 函数从起始位置 0 开始探索。
    • 最后输出最少跳跃次数和最优路径。

示例运行

输入

5
2 3 1 1 4

输出

2 0->1->4

解释:最少需要跳跃 2 次,路径为从 0 跳到 1,再从 1 跳到 4

复杂度分析

  • 时间复杂度:最坏情况下,需要探索所有可能的跳跃路径,时间复杂度为 O(2n),其中 n 是数组长度。因为每个位置都可能有多种跳跃选择,呈现指数级增长。
  • 空间复杂度:主要用于存储递归栈和路径,空间复杂度为 O(n),其中 n 是数组长度,递归深度最多为 n,路径存储也最多为 n 个元素。

优化思路

若要处理更大规模的数组,可添加剪枝逻辑:当当前跳跃次数已经大于等于已知的最少跳跃次数时,直接终止当前路径的探索,避免无效递归,可有效减少时间消耗。

http://www.xdnf.cn/news/1424719.html

相关文章:

  • 专项智能练习(Word)
  • JavaSE:抽象类和接口
  • 计算机视觉(五):blur
  • 原子操作(Atomic Operation) 是指不可被中断的操作——要么完整执行,要么完全不执行
  • 贵州在假期及夏天结束后保持旅游活力的策略分析
  • AI如何重塑电力工程设计?揭秘良策金宝AI的六大“超能力”
  • SQLSERVER关键字:N
  • VBA数据库解决方案第二十二讲:根据工作表数据生成数据库中数据表
  • 算法练习——189.轮转数组
  • 【逆序对 博弈】P10737 [SEERC 2020] Reverse Game|普及+
  • 【开题答辩全过程】以 基于JSP的养生网站设计与实现为例,包含答辩的问题和答案
  • MySQL 中 InnoDB 引擎的事务隔离级别与“可重复读”隔离级别下的 SQL 编写规范
  • Linux 进程间通信(IPC)
  • 大型语言模型微调 内容预告(69)
  • 【Docker】2025版Ubuntu 22.04 安装 Docker Docker Compose 指南
  • 电力工程师的AI时代已来,这6大功能彻底颠覆传统工作模式
  • 系统性学习数据结构-第二讲-顺序表与链表
  • 金融数据安全
  • 基于单片机汽车防盗系统/汽车安全防丢系统
  • 动态代理设计模式
  • 多模态大语言模型部署
  • Java泛型通配符详解:搞懂?/extends/super用法,避开集合操作踩坑点
  • 二、感知机
  • 高防IP防护效果评估全攻略:从指标解读到实战测试
  • langgraph / openmanus / suna 对比
  • 数据安全不用愁,群晖NAS让你存得放心、用得安心
  • 深度学习环境搭建运行(二) Ubuntu22.04安装基于CUDA11.8的ONNXRuntime-gpu1.18.1详细步骤(新手入门)
  • 联邦学习的文献复现与创新思路指导
  • Qt 项目文件(.pro)中添加 UI 文件相关命令
  • 深度学习】--卷积神经网络