先看要求
题意理解:如题意所示,但注意 “可以跳跃的最大长度”指的是可跳跃范围!
解题思路:做法有多种,最简单的利用多重嵌套if-else if-else或多重循环嵌套(for、while等)这里就不演示了。
通过贪心法来解决这道题,每次到达一个位置之后,我们都有一个可以选择的跳转范围,如果在这个范围里,我们可以选出最优跳跃路径(即最远可以达到哪个位置),就可以直接抛弃其他路径,进而解决下一步。如此反复,最后我们就能得出最后可以到达数组的哪个位置,因此,我们只要掌握了最后能到达哪个位置,就能知道可不可以达到数组末端了。
思路解决了,但是我们考虑到非负数组中还有一个特殊的存在,即0。可以跳跃范围为0的话,就无法进行跳转了,停在原地。此时分有两种情况,一是我们在前往数组末端的路上遇到了0了,那么我们就不可能达到末尾了,游戏结束,输出false.。二是虽然我们遇到了0,但是我们已经在末尾了,游戏结束,但应该输出true。所以这里需要一个判定处理,
代码部分(带详细注释)
#include <stdio.h>int main(){int i,j,z,index=0,insert=0;int a[5],b[5]={0,0,0,0,0};for(j=0;j<5;j++){scanf("%d",&a[j]);}for(i=0;i<4;i=i+index ){if(a[i] == 0){//可跳转范围为0,跳转结束if(i!=4){//当可跳转范围为0,但为最后一个元素,说明已走到末尾break;//跳出循环}elsei=4;}for(j=i+1;j<=a[i];j++){ //将下一步所有可走路径保存在b[]中 例如: 3 2 1 0 4 中第一个元素的下一步 3->2 3->1 3->0b[i]=i+a[i];// 按照下一步的可走路径将距离值保存在b[]的 例如:3->2 3->1 3->0(随便起的名字)距离值:1+2 2+1 3+0 三者可走距离值一样 }z=sizeof(b) / sizeof(int);for(;z>=0;z--){ //选出最优路径 并记录元素位置即下一跳转(最优) if(insert<b[z]){//利用for()与if()选出b[]中最大值index = a[z];//最优路径:当数组下标与数组元素的值之和最大时,可供选择的跳转范围最远insert=b[z];}}}if(i>=4){printf("ture\n");}else printf("false\n");return 0;}