奇怪的电梯
题意:大楼的每一层楼都可以停电梯,每层楼均有一个数字,电梯只有两个按钮,相应的按钮:上和 下。上下的层数等于当前楼层上的那个数字。当然,如果不能满足要求,相应的按钮会失灵。例如,一楼的数字为3,则按“上”可以到4楼,按“下”是不起作用的,因为没有-2楼。
输入
输入共有二行,第一行为三个用空格隔开的正整数,表示N,A,B(1≤N≤200, 1≤A,B≤N),第二行为N个用空格隔开的正整数,表示Ki。
输出
输出仅一行,即最少按键次数,若无法到达,则输出-1。
样例输入
5 1 5
3 3 1 2 5
样例输出
3
代码分析与讲解都在注释里,采用DP(动态规划来解答)
为了动态分配内存,采用STL的vector容器来解答,也可以简单的用数组来实现

#include <iomanip>
#include <iostream>
#include <vector>using namespace std;inline long long min(long long a, long long b) { return (a>b ? b : a); }int main()
{vector<vector<long long>> dp;//保存电梯动态规划所有解,dp[i][j]表示从第i层到第j层最少按得次数vector<long long> k;//保存电梯每一层可以上升或者下降的层数int n = 0;//n层电梯int start = 0;//开始层int end = 0;//目的层int tmp;cin >> n >> start >> end;for (int i = 0; i <= n; i++){vector<long long> v;for (int j = 0; j <= n; j++){if (i == j) v.push_back(0);//因为i == j ,所以dp[i][j]层不用按下,即0次v.push_back(INT_MAX);//INT_MAX为系统自带最大值,两个INT_MAX相加会越界,所以采用存储long long类型}dp.push_back(v);}k.push_back(0);//为了方便理解,先push一个0,使得下标从1开始for (int i = 1; i <= n; i++){cin >> tmp;k.push_back(tmp);}//首先初始化电梯按下1次即可到达的层数for (int i = 1; i <= n; i++){if (i + k[i] <= end){dp[i][i + k[i]] = 1;}if (i - k[i] >= 1){dp[i][i - k[i]] = 1;}}for (int i = 1; i <= n; i++){for (int j = 1; j <= n; j++){for (int p = 1; p <= n; p++){//电梯从i到j层就是从i到p层加上从p到j层的次数,去最小值,动态规划dp[i][j] = min(dp[i][j], dp[i][p]+dp[p][j]);}}}
/*//输出最终数组答案,for (int i = 1; i <= n; i++){for (int j = 1; j <= n; j++){if (dp[i][j] == INT_MAX) //为了方便观察,将不能到达的值输出为-1{cout << setw(5) << -1;}else{cout << setw(5) << dp[i][j];}}cout << endl;}*/if (dp[start][end] == INT_MAX) //为了方便观察,将不能到达的值输出为-1{cout << -1;}else{cout << dp[start][end];}return 0;
}

代码分析与讲解都在注释里,采用BFS解答
为了动态分配内存,采用STL的vector容器和queue队列容器来解答,也可以简单的用数组来实现

#include <iostream>
#include <vector>
#include <queue>using namespace std;int main()
{queue<int> q;  //BFS 实现用队列vector<int> v; //保存每层按钮上的数值vector<int> f; //到达每层最少的按键次数vector<bool> flag;//标记值,表示每层是否被访问过,true代表访问过int n;int start, end;//开始层和结束层int tmp;cin >> n >> start >> end;v.push_back(0);//方便起见,下标从1开始f.push_back(0);flag.push_back(false);for (int  i = 1; i <= n; i++){cin >> tmp;v.push_back(tmp);if(i == start)f.push_back(0);//初始化,start层开始为按0次,其余层为-1次elsef.push_back(-1);flag.push_back(false);}q.push(start);while (!q.empty()&& !flag.at(q.front()))//队列不为空,切第q.front()层没有被访问过{flag.at(q.front()) = true;int next = q.front() + v.at(q.front());if (next <= n) //上楼{q.push(next);f.at(next) = f.at(q.front()) + 1;//记下到达每层最少的按键次数if (next == end) //找到end层,退出while循环{break;}}next = q.front() - v.at(q.front());if (next >= 1)//下楼{q.push(next);f.at(next) = f.at(q.front()) + 1;if (next == end)//找到end层,退出while循环{break;}}q.pop();}cout << f.at(end) << endl;return 0;
}

奇怪的电梯(DP动态规划和BFS)相关推荐

  1. P1135 奇怪的电梯(BFS/DFS)

    来源:https://www.luogu.org/problemnew/show/P1135 题目描述 有一天我做了一个梦,梦见了一种很奇怪的电梯.大楼的每一层楼都可以停电梯,而且第i层楼(1≤i≤N ...

  2. 1.6.2 奇怪的电梯(BFS)

    Description 有一天uncle-lu做了一个梦,梦见了一种很奇怪的电梯. 大楼的每一层楼都可以停电梯,而且i层楼上有一个数字.电梯只有四个按钮:开,关,上,下.上下的层数等于当前楼层上的那个 ...

  3. bfs总结 bfs题单 最短路 python (奇怪的电梯 好奇怪的游戏 迷宫 马的遍历 [USACO08FEB]Meteor Shower S)

    1 可以用来遍历所有的点 2 可以用来找最短路 3 多源最短路,开始时一次向队列放之多个点#板子 """ def bfs():1 起始点入队标记入队的点while not ...

  4. (转)dp动态规划分类详解

    dp动态规划分类详解 转自:http://blog.csdn.NET/cc_again/article/details/25866971 动态规划一直是ACM竞赛中的重点,同时又是难点,因为该算法时间 ...

  5. 奇怪的电梯(洛谷-P1135)

    题目描述 呵呵,有一天我做了一个梦,梦见了一种很奇怪的电梯.大楼的每一层楼都可以停电梯,而且第 i 层楼 (1≤i≤N) 上有一个数字 Ki​(0≤Ki​≤N) .电梯只有四个按钮:开,关,上,下.上 ...

  6. 广度优先搜索——奇怪的电梯(洛谷 P1135)

    广度优先搜索普及/提高篇,今天讲述的是洛谷里的一道题 奇怪的电梯(洛谷 P1135) 说一下我解题时候的思路吧. 首先读清楚题目,题目要求输出从 a楼 到 b楼的最少次数,楼层必须在[1,n]之间升降 ...

  7. 一本通1360:奇怪的电梯(lift)

    1360:奇怪的电梯(lift) 大楼的每一层楼都可以停电梯,而且第i层楼(1≤i≤N)(1≤i≤N)上有一个数字Ki(0≤=Ki≤=N)Ki(0≤=Ki≤=N).电梯只有四个按钮:开,关,上,下.上 ...

  8. 洛谷P1135:奇怪的电梯(lift)

    题目 奇怪的电梯 - 洛谷 思路讲解 这道题主要用的是BFS(广度优先搜索),对电梯路径进行广搜,最后得出答案 广搜,全称广度优先搜索,相较dfs来讲,它更像是一个涟漪. 啥意思嘞?画一个图你就懂了 ...

  9. 洛谷 P1135 奇怪的电梯

    P1135 奇怪的电梯 代码实现 #include <iostream> #include <cstring> #include <queue> using nam ...

  10. P1135 奇怪的电梯

    题目描述 呵呵,有一天我做了一个梦,梦见了一种很奇怪的电梯.大楼的每一层楼都可以停电梯,而且第 i 层楼(1≤i≤N)上有一个数字 Ki​(0≤Ki​≤N).电梯只有四个按钮:开,关,上,下.上下的层 ...

最新文章

  1. 机器学习虽好,也要看什么场合
  2. awk多分隔符功能及wc命令案列及企业级应用
  3. SQL总结(一)基本查询
  4. Excel中这四个常出错的地方,你一定中过!
  5. python元编程_python元编程详解(3)
  6. SVN 冲突文件详解
  7. 由SELECT ... FROM ... FOR UPDATE想到的
  8. 清理localstorage_清除浏览器localstorage的数据
  9. hexo-theme-icarus配置 valine 评论系统
  10. c语言数组升序排列,数组输入各数之间用空格隔开,输出用空格隔开
  11. 寒武纪科技 服务器芯片,国内首款人工智能服务器诞生!搭载“寒武纪”芯片,走在世界前列...
  12. Robocup新手指南
  13. vue3中scrollTop不生效的问题
  14. redis学习笔记,常用方法
  15. C语言 有a,b,c,d4个数,要求按从大到小的顺序输出。
  16. 【翻译】Rosetta Large Scale System for Text Detection and Recognition in Images
  17. 手持式电波流速仪(SVR-VP)
  18. 泛生子Q3财报解析:癌症基因检测行业已呈现“燎原之势”
  19. C++高性能服务器框架——日志系统详解
  20. MIPI 系列之 DBI

热门文章

  1. (附源码)小程序 记账微信小程序 毕业设计 180815
  2. 【产业互联网周报】Azure云服务业务收入明年超Office;三星计划2021年芯片资本支出35万亿韩元;余承东挂帅华为云...
  3. 发现一款牛逼的 IDEA 插件:检测代码漏洞,一键修复!
  4. CentOS7 安装aria2
  5. 程序员如何实现“财务自由”?反正不是靠天天加班就能的!
  6. 地理信息安全在线培训考试系统题库-单选题
  7. rgb sw 线主板接口在哪_配置升级性能再突破,华硕TUF GAMING B460M-PRO 重炮手主板爆款来袭...
  8. python之数据处理篇
  9. python源码提取_从PyInstaller打包生成的EXE文件中提取Python源码
  10. 【Spring学习笔记七】-Spring MVC基本配置和实例