飞机票
题意:
思路:超级经典的一道题,有多种解法
BFS
开个标记数组,用队列,然后就判断找下去,找到就跳出,就能保证用的次数最少,没找到则是-1。
#include<bits/stdc++.h>
using namespace std;
queue<pair<int ,int >>mo;
const int maxn=20005;
int a[maxn];
int ans[maxn];
int sf[maxn];
int n;
bool jg(int d){
if(d>=1&&d<=n){
return true;
}
return false;
}
int main()
{
memset(ans,-1,sizeof(ans));
int i,j,m,f;
cin>>n>>m>>f;
rep(i,1,n){
cin>>a[i];
}
mo.push(make_pair(m,a[m]));
sf[m]=1;
if(m==f){
cout<<0<<endl;
return 0;
}
while(!mo.empty()){
int x1=mo.front().first;
int yy=mo.front().second;
int ss=mo.front().first+yy;
int xx=mo.front().first-yy;
mo.pop();
if(jg(ss)&&sf[ss]==0){
sf[ss]=1;
ans[ss]=ans[x1]+1;
mo.push(make_pair(ss,a[ss]));
if(ss==f) break;
}
if(jg(xx)&&sf[xx]==0){
sf[xx]=1;
ans[xx]=ans[x1]+1;
mo.push(make_pair(xx,a[xx]));
if(ss==f) break;
}
}
if(ans[f]!=-1)
cout<<ans[f]+1<<endl;
else
cout<<-1<<endl;
}