刷这道题让我回忆起了大一下学期的我,那个写出个dfs、bfs就很有满足感的小菜鸟~~~而如今,对图论的深刻理解,再一次写bfs~没想到却再一次认识了它!
BFS= Dijkstra + SPFA !!
#include<iostream>
#include<vector>
#include<string>
#include<map>
#include<algorithm>
#include<queue>
using namespace std;
const int maxn=222;
const int inf=0x3f3f3f3f;
int n,a,b,temp,now;
queue<int>q;
int k[maxn];
int up[maxn];
int down[maxn];
int to[maxn];
bool vis[maxn];
void init()
{
memset(up,0,sizeof(up));
memset(down,0,sizeof(down));
memset(vis,false,sizeof(vis));
memset(to,-1,sizeof(to));
return ;
}
void build()
{
for(int i=1;i<=n;i++)
{
temp=i+k[i];
if(temp<=n)
{
up[i]=temp;
}
temp=i-k[i];
if(temp>=1)
{
down[i]=temp;
}
}
return ;
}
bool bfs()
{
while(!q.empty())
{
q.pop();
}
to[a]=0;
q.push(a);
vis[a]=true;
if(b==a)
{
return true;
}
while(!q.empty())
{
now=q.front();
q.pop();
if(up[now])
{
if(!vis[up[now]])
{
to[up[now]]=to[now];
++to[up[now]];
q.push(up[now]);
vis[up[now]]=true;
if(up[now]==b)
{
return true;
}
}
}
if(down[now])
{
if(!vis[down[now]])
{
to[down[now]]=to[now];
++to[down[now]];
q.push(down[now]);
vis[down[now]]=true;
if(down[now]==b)
{
return true;
}
}
}
}
return false;
}
int main()
{
while(cin>>n)
{
if(!n) break;
cin>>a>>b;
init();
for(int i=1;i<=n;i++)
{
cin>>k[i];
}
build();
if(bfs())
{
cout<<to[b]<<endl;
}
else
{
cout<<"-1"<<endl;
}
}
return 0;
}