• P1135 奇怪的电梯


    大致题意:

    • 求从A楼致B楼要按几次按钮,若到达不了,则输出-1,
    • 第i层上下的楼层数为k[i]层。

    基本思路:

    • 毒瘤Luogu官方机器人,做梦都能梦到题目
    • 先从A层楼开始猛虎下山、潜龙出渊、气吞山河、排山倒海般的进行bfs操作,
    • 若是到了B层楼则输出步数,若是队列都出尽了还没到就说明到不了B层楼,输出-1。

    Code:

    //超·远古时期·恐龙时代の码风
    #include <iostream>
    #include <cstdio>
    #include <cstring>
    #include <algorithm>
    #include <cmath>
    #include <queue>
    #include <stack>
    #include <map>
    #include <set>
    #define ll long long
    #define ull unsigned long long
    #define For(i,a,b) for(register unsigned long long i=(a);i<(b);++i)
    #define Rep(i,a,b) for(register unsigned long long i=(a);i>=(b);--i)
    using namespace std;
    ll n,a,b,s,m[210];
    ll pd[210];
    queue<ll> k,step;//k记录楼层,step记录步数
    void bfs(){
        k.push(a);
        step.push(0);//进队列
        pd[a]=1;//标记A楼层已经到过
        while(k.size()){
            ll len=k.size();
            For(i,0,len){
                s=k.front();
                ll step_=step.front();//记录一下
                if(s==b){//若是到了B层楼
                    cout<<step_;//输出
                    return;//结束
                }
                if(s-m[s]>0&&pd[s-m[s]]!=1){//若下楼的层数合法且没去过
                    k.push(s-m[s]);
                    step.push(step_+1);//进队列
                    pd[s-m[s]]=1;//标记
                }
                if(s+m[s]<=n&&pd[s+m[s]]!=1){//若上楼的层数合法且没去过
                    k.push(s+m[s]);
                    step.push(step_+1);//进队列
                    pd[s+m[s]]=1;//标记
                }
                k.pop();step.pop();//出队列
            }
        }
    }
    int main(){
        cin>>n>>a>>b;
        For(i,1,n+1)cin>>m[i];//输入
        bfs();
        if(s!=b)cout<<-1;//若还是没到B层楼,输出-1
        return 0;
    }
    
  • 相关阅读:
    leetcode二叉树翻转二叉树
    编译PBRTv2
    人最大的快乐不是赚多少钱,而是将一个一个的梦想付诸实现。
    今天终于把工作的事定下了安心开始新的学习
    Ogre学习(二)
    关于游戏引擎关于心情
    Ogitor的安装与使用
    软件随想录
    Lost in Island
    OGRE学习(一)
  • 原文地址:https://www.cnblogs.com/FUXyao/p/12885817.html
Copyright © 2020-2023  润新知