奇怪的电梯

题目

大楼的每一层楼都可以停电梯,而且第\(i\)层楼(\(1\)\(\leq\)\(i\)\(\leq\)\(N\))上有一个数字 \(K_i\)(\(0\)\(\leq\)\(K_i\)\(\leq\)\(N\)) 。电梯只有四个按钮:开,关,上,下。上下的层数等于当前楼层上的那个数字。当然,如果不能满足要求,相应的按钮就会失灵。例如: \(3,3,1,2,5\) 代表了 \(K_i(K_1=3,K_2=3,…)\) ,从 \(1\) 楼开始。在 \(1\) 楼,按“上”可以到 \(4\) 楼,按“下”是不起作用的,因为没有 \(−2\) 楼。那么,从 \(A\) 楼到 \(B\) 楼至少要按几次按钮呢?

代码

#include<bits/stdc++.h>
const int Max=250;
using namespace std;
int f[Max],a[Max],n,p,b;
bool tf[Max];
queue<int>q;
void bfs(){
	tf[p]=true;
	f[p]=0;
	q.push(p);
	while(q.size()>0){
		int u=q.front();q.pop();
		int v=u-a[u];
		if(v>=1 && !tf[v]){
			tf[v]=true;
			f[v]=f[u]+1;
			q.push(v);
		}
		v=u+a[u];
		if(v<=n && !tf[v]){
			tf[v]=true;
			f[v]=f[u]+1;
			q.push(v);
		}
	}
	if(tf[b]) cout<<f[b];else cout<<-1;
}
int main()
{
	cin>>n>>p>>b;
	for(int i=1;i<=n;i++) cin>>a[i];
	bfs();
    return 0;
}
posted @ 2022-12-26 14:44  Euouae  阅读(36)  评论(0编辑  收藏  举报