洛谷链接:https://www.luogu.com.cn/problem/P1135
显然dfs能求出最短距离,但是若是起点和终点相同并且从起点还能走到终点的话,那么步数就不是0了
所以要是终点和起点重合的话就需要特判一下
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<queue>
using namespace std;
int n,start,finsh;
int f[10010];
int dist[10010];
int st[10010];
void bfs()
{
queue<int>q;
q.push(start);
dist[start] = 0;
while(q.size())
{
int t = q.front();
q.pop();
if(t+f[t]<=n && !st[t+f[t]])
{
q.push(t+f[t]);
st[t+f[t]] = 1;
dist[t+f[t]] = dist[t]+1;
}
if(t-f[t]>=1 && !st[t-f[t]])
{
q.push(t-f[t]);
st[t-f[t]] = 1;
dist[t-f[t]] = dist[t]+1;
}
}
}
int main()
{
cin>>n>>start>>finsh;
memset(dist,0x3f3f3f3f,sizeof dist);
for(int i=1;i<=n;i++) cin>>f[i];
bfs();
if(start==finsh)
{
cout<<0;
return 0;
}
if(dist[finsh]==0x3f3f3f3f) cout<<-1;
else cout<<dist[finsh];
return 0;
}