这是一道宽搜题,
很简单,前面写过的掌握就能写出来
#include<stdio.h>
int a[25000];
int v[25000];
int s[25000];
int next[250];
int change[3]={0,1,-1};
int main (void)
{
int n=0,x=0,y=0;
scanf("%d%d%d",&n,&x,&y);
int i=0;
for(i=1;i<=n;i++)
{
scanf("%d",&next[i]);
}
if(x==y)
{
printf("0");
return 0;
}
int head=1,tail=1;
a[tail]=x;
v[x]=1;
tail++;
int tx=0;
while(head<tail)
{
for(i=1;i<=2;i++)
{
tx=a[head]+change[i]*next[a[head]];
if(tx<1||tx>n)
{
continue;
}
if(v[tx]==0)
{
v[tx]=1;
a[tail]=tx;
s[tail]=s[head]+1;
tail++;
}
if(tx==y)
{
break;
}
}
if(tx==y)
{
break;
}
head++;
}
if(head==tail)
{
printf("-1");
}
if(head!=tail)
{
printf("%d",s[tail-1]);
}
return 0;
}
这不是今天的重点,给大家改一下题(其实是因为题目看错了,导致做了好久,有点绕,提交后WA才发现)
有一个电梯,你先输入三个数,N,A,B代表总楼层数,现在在的楼层数和想要到达的楼层
然后第二行输入N个数代表每次按电梯,都得遵守这样的规律,中间可以不按,但是得遵从规律
#include<stdio.h>
int v[2500][2500];
int next[210];
int d[25000];
int s[25000]={0,0,0,0,0,0};
int change[3]={0,1,-1};
int main (void)
{
int n=0,a=0,b=0,i=0,j=0,w=0;
scanf("%d%d%d",&n,&a,&b);
for(i=1;i<n;i++)
{
scanf("%d",&next[i]);
}
scanf("%d",&next[0]);
if(a==b)
{
printf("0");
return 0;
}
else
{
int head=1,tail=1;
d[tail]=a;
s[tail]=0;
v[tail][1]=1;
tail++;
int tx=0,f=1;
j=1;
while(head<tail)
{
for(i=1;i<=2;i++)
{
w=j%n;
tx=d[head]+change[i]*next[w];
if(tx<1||tx>n)
{
d[tail]=d[head];
s[tail]=s[head]+1;
tail++;
continue;
}
if(v[tx][w]==0)
{
v[tx][w]=1;
d[tail]=tx;
s[tail]=s[head]+1;
tail++;
}
if(tx==b)
{
break;
}
}
if(tx==b)
{
break;
}
if(s[tail-1]>10000)
{
printf("-1");
break;
}
if(s[f]+1==s[f+1])
{
j++;
}
f++;
head++;
}
if(s[tail-1]<=10000)
{
printf("%d",s[tail-1]);
}
}
return 0;
}
加油!!!(明天练一道dijkstra算法)