计蒜客 跳跃游戏
2017-10-19 17:45
162 查看
计蒜客 跳跃游戏
题目
描述给定一个非负整数数组,假定你的初始位置为数组第一个下标。
数组中的每个元素代表你在那个位置能够跳跃的最大长度。
请确认你是否能够跳跃到数组的最后一个下标。
例如: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。
输入格式
第一行输入一个正整数 (1≤n≤500),接下来的一行 n 个整数,输入数组 Ai
i
。
输出格式
如果能跳到最后一个下标,输出true,否则输出false。
样例输入
5 2 0 2 0 1
样例输出
true
题解
DFS把能跳的点打上真值,DFS所有可以到达的点,若包含n那么输出true,否则输出false
代码
#include<cstdio> #include<cstring> using namespace std; int n,sign; int a[505]; bool vis[505]; int readln() { int x=0; char ch=getchar(); while (ch<'0'&&ch>'9') ch=getchar(); while ('0'<=ch&&ch<='9') x=x*10+ch-48,ch=getchar(); return x; } void dfs(int x) { if (x==n) {sign=1;return;} vis[x]=true; for (int i=1;i<=a[x];i++) { if (x+i>n) break; if (!vis[x+i]) dfs(x+i); if (sign==1) return; } } int main() { n=readln(); for (int i=1;i<=n;i++) a[i]=readln(); memset(vis,false,sizeof(vis)); dfs(1); if (sign==1) printf("true"); else printf("false"); return 0; }