广度优先搜索普及/提高篇,今天讲述的是洛谷里的一道题 奇怪的电梯(洛谷 P1135)

说一下我解题时候的思路吧。

首先读清楚题目,题目要求输出从 a楼 到 b楼的最少次数,楼层必须在[1,n]之间升降。

这种求一种最短的结果,优先采用BSF比DFS效率更高。

对于电梯的一层,我们可以建立一个结构体,保存它当前是第几层楼,可以+-几层楼(注意,这里是+-几层楼,而不是可以去到第几层楼),同时保留从a层到该层按下按钮的次数。

然后用book[201] 来记录一下哪些楼已经去过,其实楼层都只走一遍,无论最小次数怎么走,一定不走之前走过的楼。

然后就是利用队列(queue),套用最基本的BFS模板即可。

这里不用遍历多个方向,只有往上和往下,两个if就可以了。

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

输入格式
共二行。

第一行为33个用空格隔开的正整数,表示N,A,B(1≤N≤200,1≤A,B≤N)N,A,B(1≤N≤200,1≤A,B≤N)。

第二行为NN个用空格隔开的非负整数,表示KiKi​。

输出格式
一行,即最少按键次数,若无法到达,则输出−1−1。

输入输出样例

输入 #1

5 1 5
3 3 1 2 5

输出 #1

3
#include<iostream>
#include<stdio.h>
#include<stdlib.h>
#include<math.h>
#include<queue>
#include<string.h>
#include<algorithm>
using namespace std;
struct lou{int now; //代表当前所在楼层int arr; //代表可以+-的楼层数int steps;
}lc[201];
int book[201],n,a,b;
queue<lou> q;
void bfs(){lc[a].steps=0; book[a]=1;q.push(lc[a]);while(!q.empty()){lou f = q.front();if(f.now == b){cout<<f.steps;break;}if(f.now+f.arr>=1&&f.now+f.arr<=b && book[f.now+f.arr]==0){lc[f.now+f.arr].steps = f.steps + 1;q.push(lc[f.now+f.arr]); book[f.now+f.arr]=1;}if(f.now-f.arr>=1&&f.now-f.arr<=b && book[f.now-f.arr]==0){lc[f.now-f.arr].steps = f.steps + 1;q.push(lc[f.now-f.arr]); book[f.now-f.arr]=1;}q.pop();}if(q.empty()) cout<<"-1";
}
int main() {cin>>n>>a>>b;for(int i=1;i<=n;i++){lc[i].now = i;cin>>lc[i].arr;}bfs();return 0;
}

广度优先搜索——奇怪的电梯(洛谷 P1135)相关推荐

  1. 广度优先搜索——Corn Maze S(洛谷 P1825)

    题目选自洛谷P1825 题目比较长,但是不难理解.因为求的是一个最短距离,所以用BFS即可. 广搜的主要思想便是将所有可行解(可到达的点)放入队列,然后再一个个遍历所有可行解(可到达的点),知道找到终 ...

  2. 广度优先搜索——字串变换(洛谷 P1032)

    题目选自洛谷P1032 题意已经把做法写得特别露骨了...最小步数,最多6个变换规则....广搜自不必说,不仅可以寻找解而且还能判断步数(根据广搜首解最优的性质可以得到). 用queue来进行广搜,需 ...

  3. 广度优先搜索——填涂颜色(洛谷 P1162)

    题目选自洛谷P1162 首先讲一下思路:根据题意,当找到第一个1时,其右下必然是圈内的0,那么只要从这个0开始广搜寻找联通块就可以了.(因为圈只有一个,那么当找到第一个1之后便要打断循环,很重要!) ...

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

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

  5. 洛谷 P1135奇怪的电梯

    洛谷 P1135奇怪的电梯 代码 import java.io.*; import java.math.BigInteger; import java.util.*;public class Main ...

  6. 广度优先搜索——好奇怪的游戏(洛谷 P1747)

    题目选自洛谷P1747 简单的广搜模板题,4+8 = 12个方向进行bfs,目的地是(1,1) 每次查看队首是否到达,若到达(1,1) 则返回队首步长即可~ 需要注意的是,马走日和像走田的位置计算 i ...

  7. 洛谷 P1135 奇怪的电梯

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

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

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

  9. 深度优先搜索——单词接龙(洛谷 P1019)

    题目选自洛谷P1019 首先在题意上可能有些误解. 两个单词合并时,合并部分取的是最小重叠部分 相邻的两部分不能存在包含关系就是说如果存在包含关系,就不能标记为使用过. 每个单词最多出现两次. (其实 ...

最新文章

  1. 实现多种方式对MYSQL进行备份
  2. PHP基础1--环境搭建
  3. 大数据架构师训练营学习笔记
  4. mysql char varchar 性能_Mysql小细节:varchar与char在性能上的特点
  5. http请求丢部分数据_温故知新,HTTP/2
  6. 【java学习之路】(java SE篇)003.java SE基础语法之数组
  7. bzoj4571/luogu3293 美味 (主席树+贪心)
  8. Sharepoint 浅谈 [转]
  9. 微信小程序列表懒加载
  10. ffmpeg转码命令
  11. EDA与VHDL题目——38译码器
  12. OpenCV C++案例实战十《车牌号识别》
  13. pdf照片显示正常打印时被翻转_你确定你会打印准考证了?89%的人都不会!
  14. 计算机图形学入门(十三)-光线追踪(基本原理)
  15. caj转word免费转换怎么操作?
  16. C#调用触摸屏小键盘
  17. CSDN周赛52期及53期浅析
  18. win7锁屏背景壁纸修改
  19. 豆瓣8.6分的《长安十二时辰》,为什么有人却并不喜欢?
  20. Photoshop给图片替换蓝天白云背景

热门文章

  1. EMA算法的C#实现
  2. 白话算法(6) 散列表(Hash Table) 从理论到实用(下)
  3. 关于如何学好网络 送给学习网络工程的学生
  4. python中的 同步与异步 互斥锁 和 死锁
  5. JavaScript选择器
  6. php 如何设置后台,phpcms怎么重新设置后台网址
  7. java和硬件交互_Java内存模型
  8. 如何检测过时的Kubernetes API
  9. opensource项目_最佳Opensource.com:科学
  10. Bootstrap3 表格样式