有一天桐桐做了一个梦,梦见了一种很奇怪的电梯。大楼的每一层楼都可以停电梯,而且第i层楼(1≤i≤N)上有一个数字K;(0≤Ki≤N)。电梯只有四个按钮:开,关,上,下。上下的层数等于当前楼层上的那个数字。当然,如果不能满足要求,相应的按钮就会失灵。例如:3 3 1 2 5代表了Ki (K1=3,K2=3,…),从一楼开始。在一楼,按“上,”可以到4楼,按“下”是不起作用的,因为没有-2楼。那么,从A楼到B楼至少要按几次按钮呢?
输入
第1行为三个正整数,表示N,A,B(1≤N≤200,1≤A,B≤N);
第2行为N个正整数,表示Ki。
输出
1行,即最少按键次数,若无法到达,则输出-1。
样例输入 Copy
5 1 5 3 3 1 2 5
样例输出 Copy
3
提示
上述答案得到方式如下:
从1楼按上,上到4楼
在4楼按下,到达2楼
在2楼按上,到达5楼
共3步
//dfs
#include <stdio.h>
#include <string.h>
int n,A,B,m,q=0,h[10000];
int a[250][2],p[1000],v[1000];
int dfs(int k,int s);
int main()
{
int i;
int c;
memset(h,0x3f,sizeof(h));
scanf("%d%d%d",&n,&A,&B);
c=A;
for(i=1;i<=n;i++)
{
scanf("%d",&a[i][0]);
a[i][1]=a[i][0]*(-1);
}
dfs(c,0);
if(q==0) printf("-1");
else
printf("%d",h[B]);
}
int dfs(int k,int s)
{
int i;
if(s>=h[k])
{
return 0;
}
h[k]=s;
if(k==B)
{
q=1;
return 0;
}
else
{
for(i=0;i<2;i++)
{
if(k+a[k][i]<1||k+a[k][i]>n||k+a[k][i]==A||v[k+a[k][i]]==1) continue;
v[k+a[k][i]]=1;
dfs(k+a[k][i],s+1);
v[k+a[k][i]]=0;
}
}
}
//bfs
#include <stdio.h>
int n,A,B,m,w=0;
int a[250][2],p[1000],v[1000],s[250],q[1000];
int main()
{
int i;
int c;
scanf("%d%d%d",&n,&A,&B);
c=A;
for(i=1;i<=n;i++)
{
scanf("%d",&a[i][0]);
a[i][1]=a[i][0]*(-1);
}
if(A==B)
{
printf("0");
return 0;
}
int head=0,tail=1,x;
v[head]=1;
q[0]=A;
while(head<tail)
{
for(i=0;i<2;i++)
{
x=q[head]+a[q[head]][i];
if(x<1||x>n||v[x]==1) continue;
v[x]=1;
s[x]=s[q[head]]+1;
q[tail]=x;
if(x==B)
{
printf("%d",s[x]);
w=1;
return 0;
}
tail++;
}
head++;
}
if(w==0) printf("-1");
}