网站首页 > 基础教程 正文
跳跃游戏规则描述:先给定一个非负整数数组nums,例如 [4,4,0,2,3,3,1,2,4,2],假定一台机器人要从nums[0]起跳,num[0]元素的值表示能跳跃的最大距离,也就是说,机器人第一次可跳跃到(4,0,2,3)中任意位置,第二次跳跃从第一次跳跃的落脚点起跳,可跳跃的最大距离是第一次跳跃的落脚点元素值。如果落脚点元素的值为0,表示无法跳跃。问,机器人针对一个给定数组(假设有n个元素),从nums[0]到nums[n-1],最少需要跳跃几次?并标记出每次跳跃落脚点的坐标。
跳跃游戏需要每次做出选择时,都要选择下一次能够有更多选择或者更远距离的位置,每一次选择都是最优选择,最后累积出的结果也是最优的解。完成跳跃游戏的程序和算法很多,如何分析、推导其过程以及所有可能情况,通过目前所学的有限编程知识完成上述功能?
分析第一次跳跃过程,从nums[0](nums[0]≠0)起跳,首先判断nums[0+1]到nums[0+nums[0]]区间内各元素能达到的最大边界 maxpos1 = j+nums[0+j],j 值范围为1到nums[0],并获得第一次跳跃落脚点的坐标 indexx1。数组nums为[4,4,0,2,3,3,1,2,4,2]时,第一次跳跃每个可选落脚点所能达到的最大边界maxpos1分别为 1+4=5;2+0=2 (0 无法跳跃);3+2=5;4+3=7;所以最优选择的落脚点坐标 indexx1=4。如果数组nums变为[4,4,0,4,3,3,1,2,4,2],那么会出现两个最大值,对于跳跃过程中出现的多个解,为了方便程序处理,皆取最后一个满足maxpos1的元素坐标。
第二跳跃,是从nums[indexx1]起跳,判断nums[indexx1+1]到nums[indexx1+nums[indexx1]]区间内各元素能达到的最大边界maxpos2 = j+nums[indexx1+j],j值范围为1到nums[indexx1],并获得第一次跳跃落脚点的坐标 indexx2。对于数组[4,4,0,2,3,3,1,2,4,2],从nums[4]起跳,第二次跳跃每个可选落脚点所能达到的最大边界maxpos2分别为1+3=4;2+1=3;3+2=5;所以最优选择的落脚点坐标 indexx2=indexx1+3=7。
第三次跳跃以此类推,通过判断indexx2+maxpos3的值是否大于等于9来确定,下一跳跃是否能够到达nums[9],数组[4,4,0,2,3,3,1,2,4,2]的indexx2+maxpos3等于9,所以最少需要3次跳跃到达终点。
对于非零数组nums,还存在几种特殊情况:
一是nums[0]等于0,即无法起跳,例如[0,1,2,3,1];
二是nums[0]大于或等于n-1,即一次跳跃即可到达终点,例如[5,2,3,0,1,6];
三是所有选择的最终落脚点皆为0,即无法继续跳跃,例如[3,2,1,0,1,2,3]或[3,3,2,1,0,1]
根据上述分析,除了sums[]数组,每次跳跃后可能达到的最大边界和落脚点坐标分别用两个数组maxpos[]和indexx[],使用vector声明数组并默认初始化为0。
知识点:
? fmax(x,y); 返回两个参数中的最大值,该函数定义于<cmath>标准库头文件中。英文对照说明:fmax() function is a library function of cmath header, it is used to find the maximum value of the given numbers, it accepts two number and returns the larger one.
? || 是逻辑或运算符,只要运算符||两边表达式有一个为ture,运算结果就为ture,判断语句执行;只有运算符||两边表达式均为false,运算结果才是false,判断语句不执行;如果前面一个表达式为true,那么就不会再执行和判断后面的表达式。
? break作用是结束跳出循环体,直接执行循环体以外的下一行语句。在单个循环语句中,break作用是跳出该循环语句;在嵌套循环中,break作用是跳出最近的循环,并且不影响外层的循环。
猜你喜欢
- 2024-11-11 C++经典算法问题:背包问题(迭代+递归算法)!含源码示例
- 2024-11-11 C++进阶教程:C#嵌套循环 c++嵌套循环break
- 2024-11-11 C++经典算法 穷举法 穷举算法的优点
- 2024-11-11 C++数据结构-- 递归 排序 c++使用递归函数实现全排列
- 2024-11-11 如何使用c++发送window消息通知 c++怎么发给别人
- 2024-11-11 C++ replace函数-C++字符串替换函数
- 2024-11-11 C++学习:循环练习题(一) c++循环结构例题解析
- 2024-11-11 C/C++最细循环解析 c++循环结构23道题
- 2024-11-11 网络编程——C++实现socket通信(TCP)
- 2024-11-11 C++ GESP 2023年6月真题 c++历年真题解析
- 最近发表
- 标签列表
-
- gitpush (61)
- pythonif (68)
- location.href (57)
- tail-f (57)
- pythonifelse (59)
- deletesql (62)
- c++模板 (62)
- css3动画 (57)
- c#event (59)
- linuxgzip (68)
- 字符串连接 (73)
- nginx配置文件详解 (61)
- html标签 (69)
- c++初始化列表 (64)
- exec命令 (59)
- canvasfilltext (58)
- mysqlinnodbmyisam区别 (63)
- arraylistadd (66)
- node教程 (59)
- console.table (62)
- c++time_t (58)
- phpcookie (58)
- mysqldatesub函数 (63)
- window10java环境变量设置 (66)
- c++虚函数和纯虚函数的区别 (66)