这道题是一个
b
f
s
bfs
bfs
分三种情况:
b
z
[
a
[
d
[
l
]
]
]
!
=
0
bz[a[d[l]]]!=0
bz[a[d[l]]]!=0
/
/
这
就
是
移
动
到
a
i
//这就是移动到a_i
//这就是移动到ai
b
z
[
d
[
l
]
−
1
]
!
=
0
bz[d[l]-1]!=0
bz[d[l]−1]!=0
/
/
这
是
减
一
//这是减一
//这是减一
b
z
[
d
[
l
]
+
1
]
!
=
0
bz[d[l]+1]!=0
bz[d[l]+1]!=0
/
/
这
是
加
一
//这是加一
//这是加一
A C C o d e AC~Code AC Code
#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdio>
#include<cmath>
using namespace std;
int l,r,n,a[100001],d[100001],g[100001];
int bz[100001];
int main()
{
freopen("walk.in","r",stdin);
freopen("walk.out","w",stdout);
cin>>n;
for(int i=1; i<=n; i++)
scanf("%d",&a[i]);
d[1]=a[1],g[1]=1;
memset(bz,1,sizeof(bz));
bz[1]=bz[a[1]]=0;
l=0,r=1;
while(l<r)
{
l++;
if(bz[a[d[l]]]!=0) //情况一
{
r++; //入队
d[r]=a[d[l]];
g[r]=g[l]+1;
bz[d[r]]=0;
if(d[r]==n) //判断
{
cout<<g[r];
return 0;
}
}
if(bz[d[l]-1]!=0) //情况二
{
r++; //入队
d[r]=d[l]-1;
g[r]=g[l]+1;
bz[d[r]]=0;
if(d[r]==n) //判断
{
cout<<g[r];
return 0;
}
}
if(bz[d[l]+1]!=0) //情况三
{
r++; //入队
d[r]=d[l]+1;
g[r]=g[l]+1;
bz[d[r]]=0;
if(d[r]==n) //判断
{
cout<<g[r];
return 0;
}
}
}
return 0;
}