先看要求
题意理解:如题意所示,但注意 “可以跳跃的最大长度”指的是可跳跃范围!
解题思路:做法有多种,最简单的利用多重嵌套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; //跳出循环 } else i=4; } for(j=i+1;j<=a[i];j++){ //将下一步所有可走路径保存在b[]中 例如: 3 2 1 0 4 中第一个元素的下一步 3->2 3->1 3->0 b[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; }