cogs 364. [HDU 1548] 奇怪的电梯 Dijkstra

364. [HDU 1548] 奇怪的电梯

★   输入文件:lift.in   输出文件:lift.out   简单对比
时间限制:1 s   内存限制:128 MB

【问题描述】

呵呵,有一天我做了一个梦,梦见了一种很奇怪的电梯。大楼的每一层楼都可以停电梯,而且第 i 层楼 (1<=i<=N) 上有一个数字 Ki(0<=Ki<=N) 。电梯只有四个按钮:开,关,上,下。上下的层数等于当前楼层上的那个数字。当然,如果不能满足要求,相应的按钮就会失灵。例如: 3 3 1 2 5 代表了 Ki(K1=3,K2=3,……) ,从一楼开始。在一楼,按 “ 上 ” 可以到 4 楼,按 “ 下 ” 是不起作用的,因为没有 -2 楼。那么,从 A 楼到 B 楼至少要按几次按钮呢?

【输入格式】

输入文件共有二行,第一行为三个用空格隔开的正整数,表示 N,A,B(1≤N≤200, 1≤A,B≤N) ,第二行为 N 个用空格隔开的正整数,表示 Ki 。

【输出格式】

输出文件仅一行,即最少按键次数 , 若无法到达,则输出 -1 。

【样例输入】

5 1 5
3 3 1 2 5

【样例输出】

3

QAQ感觉自己简直是太无聊了  居然用最短路去做广搜的题QAQ其实最短路的时间效率还是很棒的鸭(我还是用的迪杰斯特拉)m*logm这里的m最多也就400 这速度很棒诶~这里的思路就是以A为起点   把每一层向上k层和向下k层的楼层的当前层连接起来 然后还要判断一下有木有掉到地下去,或者直接飞上天了 Σ(⊙▽⊙"其实也是很简单的啦 秒过下面来贴一下我的不正常代码吧(就当是练一练模板啦)
#include<cstdio>
#include<iostream>
#include<algorithm>
#include<vector>
#include<cmath>
#include<queue>
#define pa pair<int,int>
#define maxn 205
#define INF 0x3f3f3f3f
using namespace std;
int N,A,B;
vector<int> v[maxn];
int dis[maxn],vis[maxn];
priority_queue<pa,vector<pa>,greater<pa> > q;
void Dijkstra()
{
    for(int i=0;i<=maxn;i++)
        dis[i]=INF;
    dis[A]=0;
    q.push(make_pair(0,A));
    while(!q.empty())
    {
        int x=q.top().second;
        q.pop();
        if(vis[x])
            continue;
        vis[x]=1;
        for(int i=0;i<v[x].size();i++)
        {
            int y=v[x][i];
            if(dis[y]>dis[x]+1)
            {
                dis[y]=dis[x]+1;
                q.push(make_pair(dis[y],y));
            }
        }
    }
}
int main()
{
    freopen("lift.in","r",stdin);
    freopen("lift.out","w",stdout);
    scanf("%d%d%d",&N,&A,&B);
    for(int i=1;i<=N;i++)
    {
        int k;
        scanf("%d",&k);
        if(i+k<=N)
            v[i].push_back(i+k);
        if(i-k>0)
            v[i].push_back(i-k);
    }
    Dijkstra();
    if(dis[B]==INF)
        printf("-1");
    else
        printf("%d",dis[B]);
    return 0;
}
?(^∇^*)加油哦~~~

原文地址:https://www.cnblogs.com/Tidoblogs/p/11331073.html

时间: 2024-11-06 21:06:45

cogs 364. [HDU 1548] 奇怪的电梯 Dijkstra的相关文章

HDU 1548 A strange lift(Dijkstra,简单BFS)

题目大意: 电梯有两个选项向上或向下,每层楼有一个参数ki,代表电梯可以再该楼层的基础上向上或向下移动ki层,限制条件是向上不能超过楼层总数n,向下不能少于一.输入总层数n和当前所在层数以及目标层数,然后是n个数分别代表第i层的移动范围.输出最少移动次数,若不可达,输出-1. 解题思路: 1.用Dijkstra算法,首先构建邻接矩阵,注意在构造时,要考虑i-k[i]<1和i+k[i]>n,i代表当前所在层. 1 #include<string.h> 2 #include<st

hdu 1548 A strange lift (dijkstra算法)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1548 题目大意:升降电梯,先给出n层楼,然后给出起始的位置,即使输出从A楼道B楼的最短时间. 注意的几点 (1)每次按一下,只能表示上或者是下,然后根据输入的看是上几层或者是下几层. (2)注意不能到底不存在的楼层. 详见代码. 1 #include <iostream> 2 #include <cstdio> 3 using namespace std; 4 const int IN

hdu 1548 A strange lift Dijkstra+SPFA算法AC

A strange lift Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 13777    Accepted Submission(s): 5254 Problem Description There is a strange lift.The lift can stop can at every floor as you want

hdu 1548 A strange lift (dijkstra)

A strange liftTime Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 32529    Accepted Submission(s): 11664 Problem DescriptionThere is a strange lift.The lift can stop can at every floor as you want,

hdu 1548 (dijkstra解法)(一次AC就是爽)

恭喜福州大学杨楠获得[BestCoder Round #4]冠军(iPad Mini一部) <BestCoder用户手册>下载 A strange lift Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 11670    Accepted Submission(s): 4430 Problem Description There is

奇怪的电梯(HDU1548) (Dijkstra)或者(BFS)

问题 E: 奇怪的电梯 时间限制: 1 Sec  内存限制: 64 MB提交: 35  解决: 16[提交][状态][讨论版] 题目描述 有一天桐桐做了一个梦,梦见了一种很奇怪的电梯.大楼的每一层楼都可以停电梯,而且第i层楼(1≤i≤N)上有一个数字K:(0≤Ki≤N).电梯只有四 个按钮:开,关,上,下.上下的层数等于当前楼层上的那个数字.当然,如果不能满足要求,相应的按钮就会失灵.例如:3 3 1 2 5代表了Ki (K1=3,K2=3,…),从一楼开始.在一楼,按“上,”可以到4楼,按“下

HDU 1548 (最基础的BFS了) A strange lift

这是一维的BFS,而且没有什么变形,应该是最基础的BFS了吧 题意: 有这样一个奇葩的电梯,你在第i层的时候你只能选择上或者下Ki层,也就是你只能从第i层到达i+Ki或者i-Ki层.当然电梯最低只能在1层最高只能在n层. 给出起点和终点问最少需要多少次才能到达终点,如果不能到达输出-1 没有什么好解释的了,如此单纯的一道题,只要不是太粗心就能A过去 1 //#define LOCAL 2 #include <iostream> 3 #include <cstdio> 4 #incl

TYVJ P3522 &amp;&amp;洛谷 P1135 奇怪的电梯 Label:bfs

题目描述 呵呵,有一天我做了一个梦,梦见了一种很奇怪的电梯.大楼的每一层楼都可以停电梯,而且第i层楼(1<=i<=N)上有一个数字Ki(0<=Ki<=N).电梯只有四个按钮:开,关,上,下.上下的层数等于当前楼层上的那个数字.当然,如果不能满足要求,相应的按钮就会失灵.例如:3 3 1 2 5代表了Ki(K1=3,K2=3,……),从一楼开始.在一楼,按“上”可以到4楼,按“下”是不起作用的,因为没有-2楼.那么,从A楼到B楼至少要按几次按钮呢? 输入输出格式 输入格式: 输入文件

奇怪的电梯//错误代码!!!!20分

§奇怪的电梯(lift.cpp) §[问题描述] §大楼的每一层楼都可以停电梯,而且第i层楼(1<=i<=N)上有一个数字Ki(0<=Ki<=N).电梯只有四个按钮:开,关,上,下.上下的层数等于当前楼层上的那个数字.当然,如果不能满足要求,相应的按钮就会失灵.例如:3 3 1 2 5代表了Ki(K1=3,K2=3,……),从一楼开始.在一楼,按“上”可以到4楼,按“下”是不起作用的,因为没有-2楼.那么,从A楼到B楼至少要按几次按钮呢? §[输入格式]lift.in §输入文件共