计蒜客 跳跃问题
给定一个非负整数数组,假定你的初始位置为数组第一个下标。
数组中的每个元素代表你在那个位置能够跳跃的最大长度。
请确认你是否能够跳跃到数组的最后一个下标。
例如:A=[2,3,1,1,4], 能够跳跃到最后一个下标,输出true;
A=[3,2,1,0,4], 不能跳跃到最后一个下标,输出false。
输入格式
第一行输入一个正整数 n(1≤n≤500),接下来的一行 n 个整数,输入数组 A。
输出格式
如果能跳到最后一个下标,输出true,否则输出false。
样例输入
5
2 0 2 0 1
样例输出
true
解题思想:
flag表示当前位置,p表示当前位置的前一个位置,len表示从flag跳跃时,跳跃的下一个位置。
len用来标记下一个位置是否为0,如果为0,则flag的位置往前移动一位。重复上述操作,直至flag的下一个位置大于len,或者flag≤p;
1 #include<stdio.h> 2 #include<stdlib.h> 3 int main() 4 { 5 int n,*a,i; 6 scanf("%d",&n); 7 a=(int*)malloc(sizeof(int)*(n+1)); 8 for(i=1;i<=n;i++) 9 scanf("%d",&a[i]); 10 11 int p=1;//当前位置的前一个位置 12 int flag=p+a[p];//当前的位置 13 int len=flag; 14 while(flag>p) 15 { 16 if(flag>=n) 17 break; 18 else 19 { 20 if(a[a[flag]+flag]==0||a[flag]+flag<=len) 21 flag--; 22 else 23 { 24 len=a[flag]+flag; 25 p=flag; 26 flag=a[flag]+flag; 27 } 28 } 29 } 30 if(flag==p) 31 printf("false\n"); 32 else 33 printf("true\n"); 34 }
GitHub : https://github.com/fxiaoyu97
博客园 : https://www.cnblogs.com/tudou1179006580
微信公众号 : 三更编程菌
Copyright ©2019 卡洛小豆
【转载文章务必保留出处和署名,谢谢!】
博客园 : https://www.cnblogs.com/tudou1179006580
微信公众号 : 三更编程菌
Copyright ©2019 卡洛小豆
【转载文章务必保留出处和署名,谢谢!】