HDU-1548 A strange lift
A strange lift(HDU-1548)
原题传送门
本题的题意大致为,一栋楼有N层,一个人想从A层到B层去,其中电梯在不同的层数上能够上下移动的层数不同,问最短需要操作几次电梯?
分析下题目给的测试样例:
5 1 5
3 3 1 2 5
意味着一共有五层楼,这个人希望从第一楼到第五楼去,其中电梯在一楼可以选择向上或者向下三层,二楼可以向上或者向下三层,三楼可以向上或者向下一层,四楼可以向上或者向下两层,五楼可以向上或者向下五层。
手推一遍可以发现:
- 一楼可以到达4层
- 二楼可以到达5层
- 三楼可以到达2层,4层
- 四楼可以到达2层
- 五楼哪也去不了
不难发现最短的路径即为 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相关推荐
- hdu 1548 A strange lift
A strange lift Time Limit : 2000/1000ms (Java/Other) Memory Limit : 65536/32768K (Java/Other) Tota ...
- hdu 1548 A strange lift (BFS)
解题思路:BFS 注意点:每次查询结束后,要清空队列 #include <iostream> #include <queue> #include <cstring> ...
- 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 ...
- HDU A strange lift
A strange lift Time Limit : 2000/1000ms (Java/Other) Memory Limit : 65536/32768K (Java/Other) Tota ...
- SDAU 搜索专题 13 A strange lift
1:问题描述 Problem Description There is a strange lift.The lift can stop can at every floor as you want, ...
- HDU1548:A strange lift(Dijkstra或BFS)
题目链接 http://acm.hdu.edu.cn/showproblem.php?pid=1548 题意:电梯每层有一个数,例如第n层有个数k, 那么这一层只能上k层或下k层,但是不能低于一层或高 ...
- 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 ...
- 【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 ...
- hdu 1548 升降梯
题目大意:有一个升降机,它有两个按钮UP和DOWN,给你一些数i表示层数,并且每层对应的Ki,如果按UP按钮,会从第i层升到第i+Ki层:如果按了DOWN则会从第i层降到第i-Ki层:并规定能到的层数 ...
- 杭电OJ分类题目(4)-Graph
原题出处:HDOJ Problem Index by Type,http://acm.hdu.edu.cn/typeclass.php 杭电OJ分类题目(4) HDU Graph Theory - U ...
最新文章
- Arm 十年重磅发布 v9 架构,不受 EAR 约束,未来将覆盖 3000 亿颗芯片
- html计时节日,原生js实现节日时间倒计时功能
- outguess秘钥加密--[BJDCTF 2nd]圣火昭昭-y1ng
- 这三个NLP项目写进简历,网申通过率提高50%
- 使用Hibernate编写通用数据库操作代码
- Eclipse安装SVN插件方式简明介绍
- 基于Delphi的接口编程入门
- Spring AOP源码解析——AOP动态代理原理和实现方式
- CF1556D-Take a Guess【交互】
- 【转】深入浅出图解C#堆与栈 C# Heap(ing) VS Stack(ing) 第六节 理解垃圾回收GC,提搞程序性能****
- 大图社区搜索的调查综述(二)——预备知识
- Python学习之==常用模块
- Vue自定义插件方法大全
- HashSet中add的执行过程
- oracle 10g oci.dll 下载,Oracle 11g oci.dll下载
- 使用谷歌学术镜像查找英文论文、英文论文阅读
- 数据收发过程中的网络设备状态
- android mov转mp4格式转换,如何在线将MOV文件转换成MP4文件?
- 天载配资关注这个转折点机会
- 专为风电筒叶片除冰研发的爬壁机器人
热门文章
- Android JNI开发三: SO库的使用
- scikit-learn:4.3. Preprocessing data(standardi/normali/binari..zation、encoding、missing value)
- 营业执照验证php,基于PHP的营业执照识别示例代码-六派数据
- 猴子排序算法_猴子排序-有史以来最慢的排序算法?
- java ee字体_JavaEE——CSS字体样式
- android测试版微信7.0下载地址,微信8.0.6手机测试版本
- JSR规范系列(1)——Java版本、JSR规范和JCP社区流程概述
- 恒天餐饮管理系统服务器代码,恒天餐饮管理软件使用教程.doc
- 全国计算机等级考试二级Python(2021年9月)备考笔记 第十二天
- 电脑网络wifi图标消失,图标变成灰色的解决办法之一