A strange lift HDU - 1548

一个电梯,每一层可以上行或下行不同的层数,问从一层到另一层需要按几次按键

原题:http://acm.hdu.edu.cn/showproblem.php?pid=1548

ac:

#include<cstdio>
#include<cstring>
const int N=210, INF=0x3f3f3f3f;     //无穷大只能定义成这个。。。。。999999之类的不行
int d[N], w[N][N],vis[N],n,m,k[210];

void Dijkstra(int s)
{
    memset(d,INF,sizeof(d));
    d[s] = 0;
    memset(vis, 0, sizeof(vis));
    for(int i=1; i<=n; ++i)
    {
        int u=-1;
        for(int j=1; j<=n; ++j)if(!vis[j])
        {
            if(u==-1 || d[j]<d[u]) u=j;
        }
        vis[u] = 1;
        for(int v=1;v<=n;v++)
        {
            if(vis[v]==0&&d[u]+w[u][v]<d[v])
            {
                d[v]=d[u]+w[u][v];
            }
        }
    }
}
int main()
{
    int s,e;
    while(scanf("%d",&n)&&n!=0)
    {
        scanf("%d %d",&s,&e);
        memset(w,INF,sizeof(w));
        for(int i=1;i<=n;i++)
        {
            scanf("%d",&k[i]);
            if(i+k[i]<=n)   //不大于n
                w[i][i+k[i]]=1;    //设能到达的层之间权值为1
            if(i-k[i]>=1)
                w[i][i-k[i]]=1;   //同上
            
        }
        Dijkstra(s);
        if(d[e]==INF)
            printf("-1\n");
        else
            printf("%d\n",d[e]);
    }
    
    return 0;
}

猜你喜欢

转载自blog.csdn.net/henu_xujiu/article/details/79368512