给定一个非负整数数组,假定你的初始位置为数组第一个下标。
数组中的每个元素代表你在那个位置能够跳跃的最大长度。
请确认你是否能够跳跃到数组的最后一个下标。
例如:A = [2,3,1,1,4]A=[2,3,1,1,4] 能够跳跃到最后一个下标,输出true
;
A = [3,2,1,0,4]A=[3,2,1,0,4] 不能跳跃到最后一个下标,输出false
。
输入格式
第一行输入一个正整数 n(1 \leq n \leq 500)n(1≤n≤500),接下来的一行 nn 个整数,输入数组 A_iAi。
输出格式
如果能跳到最后一个下标,输出true
,否则输出false
。
样例输入
5 2 0 2 0 1
样例输出
true
贪心:
选择所有下一跳中能跳到的地方最远的的点,如样例,点1有两种跳法,跳到2或3,
其中2的最大长度为0,能跳到最远的地方就是2+0=2,
3的最大长度为2,能跳到最远的地方就是3+2=5,
所以选3,之后循环,直到跳的地点>=n或者只能跳0
#include<cstdio>
using namespace std;
int A[505];
int main(){
int n;
scanf("%d",&n);
for(int i=0;i<n;i++){
scanf("%d",&A[i]);
}
if(n==1){
printf("true");
return 0;
}
int i=0;
while(i<n-1){
if(A[i]==0){
printf("false");
return 0;
}
int p=i+1;
for(int j=p;j<=i+A[i];j++){
if(j+A[j]>p) p=j;
}
i=p;
}
printf("true");
return 0;
}
dfs:
搜索是否能跳到n或更远
#include<cstdio>
using namespace std;
int A[505],visit[505];
int n;
bool dfs(int i){
if(i>=n-1) return true;
if(A[i]==0) return false;
if(visit[i]) return false;
visit[i]=1;
for(int j=1;j<=A[i];j++){
if(dfs(i+j)) return true;
}
return false;
}
int main(){
n;
scanf("%d",&n);
for(int i=0;i<n;i++){
scanf("%d",&A[i]);
}
if(n==1){
printf("true");
return 0;
}
if(dfs(0)) printf("true");
else printf("false");
return 0;
}