hdu1548: A strange lift

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
*/

posted on 2012-07-25 17:27  acmer-jun  阅读(137)  评论(0编辑  收藏  举报

导航