P1135 奇怪的电梯(淼淼总结BFS)

        继续闲聊,这个题目是BFS的基础题目但是巩固,提取出来的知识也更精髓,我也将用两种方法展现:1.BFS;2.Floyd。今天有幸跟蔡大佬交流,希望自己有一天也能codefores(div2)AK。废话不多说,上题目:

P1135 奇怪的电梯 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)icon-default.png?t=M276https://www.luogu.com.cn/problem/P1135

1.BFS 

 

 题目分析:

1.首先看到这个楼层+步数,可以定义一个结构体,(1.先在我们位于第几层楼里了)(2.我们操作这个按钮已经几次了)。

2.还是vis数组标记已经访问过得楼层,这其实有点不太好理解,为啥要标记呢?因为重复访问只会增加它的按钮次数,所以一定要标记访问过得数组。

3.因为这层楼的层数是有限制的,所以在楼层访问时一定要控制范围,(楼梯上下都可以去)。

上下你准备如何去操作呢?

4.利用队列,如果最后找到了该层楼就break,找不到的话就输出“-1”。

5.总体就是BFS经典思路,取队首,pop(),判断,标记,符合条件重新压入队列。

代码如下:

#include <iostream>
#include <vector>
#include<queue>
using namespace std;
struct node {
    int f;//走到了第几层楼了
    int step;//走了多少步啊
};
queue<node>s;
int vis[250];
int k[300];
int main()
{
    int n, a, b;
    cin >> n >> a >> b;
    for (int i = 1; i <= n; i++) {
        cin >> k[i];
    }
    s.push(node{ a,0 });
    vis[a] = 1;
    node top;
    while (!s.empty()) {
        top = s.front();
        s.pop();
        if (top.f == b) {
            break;
        }
        for (int i = -1; i <= 1; i += 2) {//向上还是向下走
            int dist = top.f + i * k[top.f];
            if (dist > 0 && dist <= n && vis[dist]==0) {//判断条件
                vis[dist] = 1;
                s.push(node{ dist,top.step + 1 });//进行下一个楼层的下一次操作,按钮次数加一
            }
        }
    }
    if (top.f == b) {//如果有符合条件的
        cout << top.step << endl;
    }
    else {
        cout << "-1" << endl;/没有符合条件的
    }
}

        总体来说本博主想更新Floyd算法(多源最短路径,其实无非就是不停更新最小值),今晚博主去codefores比赛了,所以很累很累,先更新Codefores最新状况,明天更新Floyd。感谢观看!

  • 3
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

钟一淼

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值