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;
}
原文地址:https://www.cnblogs.com/FUXyao/p/12885817.html