一、
1、
#include<iostream> #include<cmath> using namespace std; bool CanJump(int n[],int num) { if (num==1) return 1; //如果向量长度为 1,则 int loc; int gla=0; for(int i=0;i<num-1;i++) { if(gla<i){ //进入不到下一步 break; } loc=i+n[i]; //局部变量,每一个位置能达到的最远位置 gla=max(gla,loc); //全局变量,达到的最大位置 ,一定要注意判断,两者融合的过程 } if(gla>=num-1) { return 1; } else{ return 0; } } int main() { int a[]={2,3,1,1,4}; if(CanJump(a,5)==1) { cout<<"True"; } else{ cout<<"False"; } return 0; }
2、
当{3,2,1,0,4}时,如下结果
二、
1、在上面的基础上改
#include<iostream> #include<cmath> using namespace std; int CanJumpNum(int n[],int num) { if (num==1) return 0; //如果向量长度为 1,则留在原地 int loc; int gla=0; int step=0; for(int i=0;i<num-1;i++) { if(gla<i){ //进入不到下一步 break; } loc=i+n[i]; //局部变量,每一个位置能达到的最远位置 if(loc>gla){ step++; } gla=max(gla,loc); //全局变量,达到的最大位置 ,一定要注意判断,两者融合的过程 if(gla>=num-1) //结束的标志 { break; } } if(gla>=num-1) { return step; } else{ return -1; } } int main() { int a[]={7,0,9,6,9,6,1,7,9,0,1,2,9,0,3}; cout<<CanJumpNum(a,15); return 0; }//2,3,1,1,4
出现这种情况,这是因为,两步过程是7—7—3;
而程序中的4步是。这是因为我们到7后又重头考虑,没有在7上继续加。所以这个思路是有漏洞的。
2、
#include<iostream> #include<cmath> using namespace std; int CanJumpNum(int A[],int n) { int curReach=0,maxReach = 0,steps=0; for(int i=0;i<n && i<=maxReach;i++) { if(i>curReach) //steps-1步能够到达的距离,必须再走一步了 { ++steps; curReach = maxReach; } maxReach = max(maxReach,i+A[i]); // step步最远距离 } if(maxReach<n-1) return -1; else return steps; } int main() { int a[]={7,0,9,6,9,6,1,7,9,0,1,2,9,0,3}; cout<<CanJumpNum(a,15); return 0; }//2,3,1,1,4