自定义输入:2 0 1 1 3 0 1 1 -1
预期输出:是。
我的输出:否
我的代码:
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
int pv(int *a, int i){ //Function to create positional value.
if(a[i]!=0) return (a[i]+i);
else return 0;
}
int main() {
//code
int i,j,k,check=0;
int *a = (int *)malloc(1024*sizeof(int));
for(i=1;;i++) { scanf("%d",a+i);
if(*(a+i)==-1) { i--; break; } }
a = realloc(a,(i+1)*sizeof(int));//Just to decrease the size.
//Array of numbers inputed with designation from 1 formed.
int max_pv =0;
for(k=1;k<i;){
for(j=k+1;j<=pv(&a[k],k);){
if(max_pv<pv(&a[j],j)) {
max_pv = pv(&a[j],j);
check =j;//Location of max_pv.
}
}
k = check;
if(max_pv==0) { printf("NO"); return 0; }
if(max_pv>=i) { printf("YES"); return 0;}
max_pv = 0;
}
}
问题陈述:
将为您提供非负整数列表作为输入。该列表将以-1结尾,但-1不属于列表。此列表中数字的值表示其“跳转大小”。
例如,如果位置i处的数字为3,则该元素处的跳转大小为3。这意味着该位置右边3距离之内的所有位置都可以从该位置到达。单跳。更准确地说,如果位置i上的数字为3,则C先生可以在一次“跳跃”中从位置i转到位置i + 1或i + 2或i + 3。
列表的第一个数字位于位置1(与第一个元素为下标0的数组不同)。如果可以任意跳数到达,则位置j处的数字可以说是从位置i“可到达”的。 C先生首先跳到位置1(这是他的初始跳)。现在,他可以按照上述规则允许的任意顺序进行任意数量的跳跃。但是,所有跳转都在列表的右侧,即没有向后跳转。
打印,如果从位置1可以到达列表中的最后一个位置(即-1之前的位置),则输出为“是”(不带引号),否则请打印“否”(不带引号)。
我的问题:
我尝试在此代码上运行调试器,而我得到的错误是,即使k = 1,函数pv也返回零。
在此示例中,a [1] =2。因此该函数应返回a [1] + 2 =3。但是它返回0。
这是根据调试器确定的。如果其他任何问题仍然存在,请同时提及。
谢谢。
答案 0 :(得分:0)
您正在传递指向a[j]
(或a[k]
)的指针,而不仅仅是a
到pv
的指针。