HDU1548:A strange lift(Dijkstra或BFS)
题目链接
http://acm.hdu.edu.cn/showproblem.php?pid=1548
题意:电梯每层有一个数,例如第n层有个数k,
那么这一层只能上k层或下k层,但是不能低于一层或高于n层,
给定起点与终点,要求出最少要按几次键
我的思路:这题可以用bfs或者用最短路(dijsktra)
bfs
AC代码
#include<cstdio>
#include<iostream>
#include<cstring>
#include<queue>
using namespace std;
int n,a,b,dis[210],vis[210];
struct node
{
    int now;
    int step;
};
int main(void)
{
    int bfs();
    int i;
    while(scanf("%d",&n)==1&&n)
    {
       memset(vis,0,sizeof(vis));
       scanf("%d%d",&a,&b);
       for(i=1;i<=n;i++)
       scanf("%d",dis+i);
       printf("%d\n",bfs());
    }
    return 0;
}
int bfs()
{
    int i;
    queue<node> q;
    vis[a]=1;
    node start,next;
    start.now=a;
    start.step=0;
    q.push(start);
    while(!q.empty())
    {
        node s=q.front();
        q.pop();
        if(s.now==b)
        return s.step;
        for(i=0;i<2;i++)
        {
            if(0==i)
            next.now=s.now+dis[s.now];
            else
            next.now=s.now-dis[s.now];
            if(!vis[next.now]&&next.now>=1&&next.now<=n)
            {
                if(next.now==b)
                return s.step+1;
                vis[next.now]=1;
                next.step=s.step+1;
                q.push(next);
            }
        }
    }
    return -1;
}
最短路算法
#include<stdio.h>
#include<string.h>
int n,a,b,dis[210],vis[210],map[210][210];
const int Max = 0x3f3f3f3f;
int main(void)
{
    int i,j,k,l;
    while(scanf("%d",&n)==1&&n)
    {
        memset(vis,0,sizeof(vis));
        for(i=1;i<=n;i++)
        {
            for(j=1;j<=n;j++)
            {
                if(i!=j)
                map[i][j]=Max;
                else
                map[i][j]=0;
            }
        }
        scanf("%d%d",&a,&b);
        for(i=1;i<=n;i++)
        {
            scanf("%d",dis+i);
            if(i-dis[i]>=1&&i+dis[i]<=n)
            map[i][i-dis[i]]=map[i][i+dis[i]]=1;
            else if(i-dis[i]>=1)
            map[i][i-dis[i]]=1;
            else
            map[i][i+dis[i]]=1;
        }
        for(i=1;i<=n;i++)
        dis[i]=map[a][i];
        for(i=1;i<=n;i++)
        {
            l=Max;
            for(j=1;j<=n;j++)
            {
                if(!vis[j]&&l>dis[j])
                {
                    k=j;
                    l=dis[j];
                }
            }
            if(l==Max)  break;
            vis[k]=1;
            for(j=1;j<=n;j++)
            {
                if(!vis[j]&&dis[j]>dis[k]+map[k][j])
                dis[j]=dis[k]+map[k][j];
            }
        }
        if(dis[b]==Max)
        printf("-1\n");
        else
        printf("%d\n",dis[b]);
    }
    return 0;
}
 
                     
                    
                 
                    
                
 
                
            
         
         浙公网安备 33010602011771号
浙公网安备 33010602011771号