大致题意:
- 求从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;
}