计蒜客 跳跃问题

给定一个非负整数数组,假定你的初始位置为数组第一个下标。

数组中的每个元素代表你在那个位置能够跳跃的最大长度。

请确认你是否能够跳跃到数组的最后一个下标。

例如: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 }

 

posted @ 2017-07-14 10:52  卡洛小豆  阅读(200)  评论(0编辑  收藏  举报