A strange lift(HDU-1548)

原题传送门

本题的题意大致为,一栋楼有N层,一个人想从A层到B层去,其中电梯在不同的层数上能够上下移动的层数不同,问最短需要操作几次电梯?

分析下题目给的测试样例:

5 1 5
3 3 1 2 5

意味着一共有五层楼,这个人希望从第一楼到第五楼去,其中电梯在一楼可以选择向上或者向下三层,二楼可以向上或者向下三层,三楼可以向上或者向下一层,四楼可以向上或者向下两层,五楼可以向上或者向下五层。

手推一遍可以发现:

  1. 一楼可以到达4层
  2. 二楼可以到达5层
  3. 三楼可以到达2层,4层
  4. 四楼可以到达2层
  5. 五楼哪也去不了

不难发现最短的路径即为 1 -->4 -->2 -->5,即3次辗转即可。

解题思路一:最短路

经过上述的分析不难发现,该问题可以抽象为一个图论的问题,且是有向图,每一次移动的代价都是1,因此我们只需要从起点出发,更新到所有点的距离,迭代完后即可求得到目标点的距离。

如下是spfa算法解题的代码:

#include <iostream>
#include <queue>
#include <cstring>using namespace std;const int N = 1e6 + 10;int sp;
int n,be,en;
int h[N],ne[N],e[N],idx;
int dist[N];
bool v[N];void add(int a,int b)
{e[idx] = b, ne[idx] = h[a], h[a] = idx++;
}//因为可能有多条输入,所以每次都得重新Init下所有参数
void Init()
{memset(h, -1, sizeof h);memset(ne, 0, sizeof ne);memset(e, 0, sizeof e);memset(v, false, sizeof v);idx = 0;
}
int spfa()
{queue<int>  q;memset(dist, 0x3f, sizeof dist);dist[be] = 0;q.push(be);v[be] = true;while(q.size()){int t = q.front();q.pop();v[t] = false;for(int i = h[t]; i != -1; i = ne[i]){int j = e[i];if(dist[j] > dist[t] + 1){dist[j] = dist[t] + 1;if(!v[j]){q.push(j);v[j] = true;}}}}return dist[en] == 0x3f3f3f3f?-1:dist[en];
} int main()
{while(1){Init();scanf("%d%d%d",&n,&be,&en);if(n == 0) break;for(int i = 1; i <= n; i ++){int to;scanf("%d",&to);if(i - to >= 1)    add(i,i - to);if(i + to <= n)    add(i,i + to);}int t = spfa();printf("%d\n",t);}return 0;
}

解题思路二:bfs

当点与点之间的距离为1的时候,这时候的bfs也可以求得两点之间的最短路。根据该特性也可以破该题目。

但是要注意的是,一定要自己特判起点和终点是否相同,因为bfs不会倒回来搜起点本身!!

#include <iostream>
#include <queue>
#include <cstring>using namespace std;const int N = 1e6 + 10;int sp;
int n,be,en;
int h[N],ne[N],e[N],idx;
int dist[N];
bool v[N];void add(int a,int b)
{e[idx] = b, ne[idx] = h[a], h[a] = idx++;
}void Init()
{memset(h, -1, sizeof h);memset(ne, 0, sizeof ne);memset(e, 0, sizeof e);memset(v, false, sizeof v);idx = 0;
}int bfs()
{queue<int> q;memset(dist, 0, sizeof dist);q.push(be);v[be] = true;if(be == en)    return 0;while(q.size()){int t = q.front();q.pop();for(int i = h[t]; i != -1; i = ne[i]){int j = e[i];if(j == en) return dist[t] + 1;if(!v[j]){dist[j] = dist[t] + 1;q.push(j);v[j] = true;}}}return -1;}int main()
{while(1){Init();scanf("%d%d%d",&n,&be,&en);if(n == 0) break;for(int i = 1; i <= n; i ++){int to;scanf("%d",&to);if(i - to >= 1)    add(i,i - to);if(i + to <= n)    add(i,i + to);}int t = bfs();printf("%d\n",t);}return 0;
}

HDU-1548 A strange lift相关推荐

  1. hdu 1548 A strange lift

    A strange lift Time Limit : 2000/1000ms (Java/Other)   Memory Limit : 65536/32768K (Java/Other) Tota ...

  2. hdu 1548 A strange lift (BFS)

    解题思路:BFS 注意点:每次查询结束后,要清空队列 #include <iostream> #include <queue> #include <cstring> ...

  3. A strange lift HDU - 1548(基础广搜)

    There is a strange lift.The lift can stop can at every floor as you want, and there is a number Ki(0 ...

  4. HDU A strange lift

    A strange lift Time Limit : 2000/1000ms (Java/Other)   Memory Limit : 65536/32768K (Java/Other) Tota ...

  5. SDAU 搜索专题 13 A strange lift

    1:问题描述 Problem Description There is a strange lift.The lift can stop can at every floor as you want, ...

  6. HDU1548:A strange lift(Dijkstra或BFS)

    题目链接 http://acm.hdu.edu.cn/showproblem.php?pid=1548 题意:电梯每层有一个数,例如第n层有个数k, 那么这一层只能上k层或下k层,但是不能低于一层或高 ...

  7. poj 1564 Sum It Up | zoj 1711 | hdu 1548 (dfs + 剪枝 or 判重)

    Sum It Up Time Limit : 2000/1000ms (Java/Other)   Memory Limit : 65536/32768K (Java/Other) Total Sub ...

  8. 【HDU - 2899】 Strange fuction(二分或三分,求导)

    题干: Now, here is a fuction:    F(x) = 6 * x^7+8*x^6+7*x^3+5*x^2-y*x (0 <= x <=100)  Can you fi ...

  9. hdu 1548 升降梯

    题目大意:有一个升降机,它有两个按钮UP和DOWN,给你一些数i表示层数,并且每层对应的Ki,如果按UP按钮,会从第i层升到第i+Ki层:如果按了DOWN则会从第i层降到第i-Ki层:并规定能到的层数 ...

  10. 杭电OJ分类题目(4)-Graph

    原题出处:HDOJ Problem Index by Type,http://acm.hdu.edu.cn/typeclass.php 杭电OJ分类题目(4) HDU Graph Theory - U ...

最新文章

  1. Arm 十年重磅发布 v9 架构,不受 EAR 约束,未来将覆盖 3000 亿颗芯片
  2. html计时节日,原生js实现节日时间倒计时功能
  3. outguess秘钥加密--[BJDCTF 2nd]圣火昭昭-y1ng
  4. 这三个NLP项目写进简历,网申通过率提高50%
  5. 使用Hibernate编写通用数据库操作代码
  6. Eclipse安装SVN插件方式简明介绍
  7. 基于Delphi的接口编程入门
  8. Spring AOP源码解析——AOP动态代理原理和实现方式
  9. CF1556D-Take a Guess【交互】
  10. 【转】深入浅出图解C#堆与栈 C# Heap(ing) VS Stack(ing) 第六节 理解垃圾回收GC,提搞程序性能****
  11. 大图社区搜索的调查综述(二)——预备知识
  12. Python学习之==常用模块
  13. Vue自定义插件方法大全
  14. HashSet中add的执行过程
  15. oracle 10g oci.dll 下载,Oracle 11g oci.dll下载
  16. 使用谷歌学术镜像查找英文论文、英文论文阅读
  17. 数据收发过程中的网络设备状态
  18. android mov转mp4格式转换,如何在线将MOV文件转换成MP4文件?
  19. 天载配资关注这个转折点机会
  20. 专为风电筒叶片除冰研发的爬壁机器人

热门文章

  1. Android JNI开发三: SO库的使用
  2. scikit-learn:4.3. Preprocessing data(standardi/normali/binari..zation、encoding、missing value)
  3. 营业执照验证php,基于PHP的营业执照识别示例代码-六派数据
  4. 猴子排序算法_猴子排序-有史以来最慢的排序算法?
  5. java ee字体_JavaEE——CSS字体样式
  6. android测试版微信7.0下载地址,微信8.0.6手机测试版本
  7. JSR规范系列(1)——Java版本、JSR规范和JCP社区流程概述
  8. 恒天餐饮管理系统服务器代码,恒天餐饮管理软件使用教程.doc
  9. 全国计算机等级考试二级Python(2021年9月)备考笔记 第十二天
  10. 电脑网络wifi图标消失,图标变成灰色的解决办法之一