hdu1548: http://acm.hdu.edu.cn/showproblem.php?pid=1548
题意:坐电梯,给出层数n,求从a到b最少要按多少次键(每层楼有一个数c[i],表示可以搭到第i-c[i]和第i+c[i]层,但只能到达1至n层,求最少需要按多少次按钮可到达目的地。
解法:bfs(也可用dij求最短路)
code:
#include<iostream>
#include<cstdio>
#include<cstdlib>
int v[250][250],k[250],d[250],q[3000*300];
const int inf=2<<29;
int main()
{
int n,a,b,x,front,rear;
while(1)
{
scanf("%d",&n);
if(n==0)break;
for(int i=0;i<250;i++)
{
d[i]=inf;
}
scanf("%d%d",&a,&b);
memset(v,0,sizeof(v));
d[a]=0;
for(int i=1;i<=n;i++)
{
scanf("%d",&k[i]);
if(i+k[i]<=n)
{
v[i][i+k[i]]=1;
}
if(i-k[i]>0)
{
v[i][i-k[i]]=1;
}
}
front=0;rear=0;q[rear++]=a;
while(front<rear)
{
x=q[front++];
for(int i=1;i<=n;i++)
{
if(v[x][i]&&(d[i]>d[x]+1))
{
d[i]=d[x]+1;
q[rear++]=i;
}
}
}
if(d[b]<inf)
printf("%d\n",d[b]);
else
printf("-1\n");
}
}
/*
input:
5 1 5
3 3 1 2 5
0
output:
3
*/