需要注意的是对于每一层,上下是有方向的, 对于某一层只有上和下都走过了才能标记为不能在到达该层;
#include <iostream>
#include <cstdio>
#include <cstring>
#include <queue>
using namespace std;
const int M = 2005;
int vist[M][2];
int s[M];
struct node
{
int id;
int sum;
};
int n, s1, e;
int ans;
int solve(int s1, int e)
{
memset(vist, 0, sizeof(vist));
queue<node>que;
node cur, next;
cur.id = s1;
cur.sum = 0;
que.push(cur);
while(!que.empty())
{
cur = que.front();
que.pop();
if(cur.id == e)
{
return cur.sum;
}
if(!vist[cur.id][1])
{
if(cur.id + s[cur.id] <= n)
{
next.id = cur.id + s[cur.id];
next.sum = cur.sum + 1;
if(next.id == e)
return next.sum;
que.push(next);
vist[cur.id][1] = 1;
}
}
if(!vist[cur.id][0])
{
if(cur.id - s[cur.id] >= 1) {
next.id = cur.id - s[cur.id];
next.sum = cur.sum + 1;
if(next.id == e)
return next.sum;
que.push(next);
vist[cur.id][0] = 1;
}
}
}
return -1;
}
int main()
{
int a;
while(scanf("%d", &n) != EOF && n)
{
scanf("%d%d", &s1, &e);
for(int i = 1; i <= n; i++)
{
scanf("%d", &a);
s[i] = a;
}
ans = solve(s1, e);
printf("%d\n", ans);
}
return 0;
}