解题思路:BFS
注意点:每次查询结束后,要清空队列
#include <iostream>
#include <queue>
#include <cstring>
#include <cstdio>
#define inf 0x3f3f3f3f
using namespace std;
int k[205];
int step[205];
int n,a,b;
void bfs(int a,int b)//a->start b->finish
{
queue <int> P;
int upstair,downstair;
memset(step,0x3f,sizeof(step));
step[a] = 0;
P.push(a);
int hd_num;
while(!P.empty())
{
hd_num = P.front();
P.pop();
if(hd_num == b)
return;
upstair = hd_num + k[hd_num];//标记此时向楼上走的位置
downstair = hd_num - k[hd_num];//标记此时向楼下走的位置
if(upstair<=n && step[upstair]==inf && upstair>=1)
{
P.push(upstair);
step[upstair] = step[hd_num] + 1;
//cout << upstair << ' ' << step[upstair] << endl;
}
if(downstair>=1 && downstair<=n && step[downstair]==inf)
{
P.push(downstair);
step[downstair] = step[hd_num] + 1;
//cout << downstair << ' ' << step[downstair] << endl;
}
}
}
int main()
{
//freopen("test.txt","r",stdin);
int i;
while(cin>>n && n)
{
cin>>a>>b;
memset(k,0,sizeof(k));
for(i=1;i<=n;i++)
{
cin>>k[i];
}
bfs(a,b);
if(step[b]==inf)
cout << "-1" << endl;
else
cout << step[b] << endl;
}
//cout << "Hello world!" << endl;
return 0;
}