您的位置:首页 > 其它

计蒜客 挑战难题 第18题:跳跃游戏

2014-10-26 16:19 369 查看
第18题:跳跃游戏

时间限制 1000 ms

内存限制 10000 K

给定一个非负整数数组,假定你的初始位置为数组第一个下标。
数组中的每个元素代表你在那个位置能够跳跃的最大长度。
请确认你是否能够跳跃到数组的最后一个下标。
例如:
A = [2,3,1,1,4],
return true.
A = [3,2,1,0,4],
return false.
格式:
第一行输入一个正整数n,接下来的一行,输入数组A
。如果能跳到最后一个下标,输出“true”,否则输出“false”

样例输入
5
2 0 2 0 1


样例输出
true




仅供参考:

#include <stdio.h>
#define MAX_LEN 1000

int jump(int pCurr,int arr[],int len,int x[]);
int main()
{

int arr[MAX_LEN];
int len = 0;
//	printf("please enter array's length:");
scanf("%d",&len);
int i = 1;
while(len --)
{
scanf("%d",&arr[i]);
i ++;
}
int xtmp[MAX_LEN + 1] = {0};

jump(1,arr,i,xtmp) == 1 ? printf("true\n") : printf("false\n");

return 0;
}

int jump(int pCurr,int arr[],int len,int x[])
{
if(pCurr == len - 1)
{
return 1;
}
for(int i = arr[pCurr];i >= 1;i --)
{
if(x[pCurr] == -1)
{
continue;
}
//	if(pCurr >= len)
//	{
//		continue;
//	}
if(jump(pCurr + i,arr,len,x) == 1)
{
return 1;
}
else
{
x[pCurr + i] = -1;
}
}
//x[pCurr] = -1;
return 0;
}

一定的简化之后:

#include <stdio.h>
#define MAX_LEN 1000

int jump(int pCurr,int arr[],int len);
int main()
{

int arr[MAX_LEN];
int len = 0;
scanf("%d",&len);
int i = 1;
while(len --)
{
scanf("%d",&arr[i]);
i ++;
}

jump(1,arr,i) == 1 ? printf("true\n") : printf("false\n");

return 0;
}

int jump(int pCurr,int arr[],int len)
{
if(pCurr == len - 1)
{
return 1;
}
for(int i = arr[pCurr];i >= 1;i --)
{
if(arr[pCurr] == -1)
{
continue;
}
if(jump(pCurr + i,arr,len) == 1)
{
return 1;
}
else
{
arr[pCurr + i] = -1;
}
}
return 0;
}

自己的习惯:

#include <stdio.h>

int Jump(int n,int A[],int x);

void main()
{
int A[1000];
int n;

scanf("%d",&n);

for(int i=0;i<n;i++)
scanf("%d",&A[i]);

Jump(n,A,0) ? printf("true\n") : printf("false\n");

}

int Jump(int n,int A[],int x)
{
if(x==n-1)
return 1;
for(int i=A[x];i>0;i--)
{
if(A[x]==-1)
break;
if(Jump(n,A,x+i)==1)
return 1;
else
A[x+i]=-1;
}
return 0;
}
一次判断足矣?

#include <stdio.h>

int Jump(int n,int A[],int x);

void main()
{
int A[1000];
int n;

scanf("%d",&n);

for(int i=0;i<n;i++)
scanf("%d",&A[i]);

Jump(n,A,0) ? printf("true\n") : printf("false\n");

}

int Jump(int n,int A[],int x)
{

if(x>=n-1)
return 1;
for(int i=A[x];i>0;i--)
{
if(Jump(n,A,x+i)==1)
return 1;
else
A[x+i]= -1;
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: