社区讨论

BFS做法大规模MIE求调

P1135奇怪的电梯参与者 2已保存回复 7

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
7 条
当前快照
1 份
快照标识符
@mlmjch4x
此快照首次捕获于
2026/02/15 00:33
4 天前
此快照最后确认于
2026/02/18 22:50
13 小时前
查看原帖
前排预警: 码风极其诡异,还望各位大佬好好调教awa (洛谷不常在线,有些回复不能很及时看到,望谅解)
CPP
#include<bits/stdc++.h>
using namespace std;
int pass[205],_floor[205];\\pass用于记载按了多少次电梯,_floor用于记载某层电梯可运行层数
int main(){
	memset(pass,-1,sizeof(pass));\\初始化,假设均不可以到达
	ios::sync_with_stdio(0);
	int n,a,b,h;
	cin>>n>>a>>b;
	for(int i=1;i<=n;i++){
		cin>>_floor[i];
	}
	pass[a]=0;\\a到a不需要按电梯
	queue<int> floor_,pass_;\\分别建立两个队列floor_与pass_,前者用于记录BFS的楼层,后者用于表示按了多少次电梯
	if(a+_floor[a]<=n){
		floor_.push(a+_floor[a]);
		pass_.push(pass[a]+1);
	}
	if(a-_floor[a]>=1){
		floor_.push(a-_floor[a]);
		pass_.push(pass[a]+1);
	}\\先将所在楼层可抵达的两层入队进行搜索
	while(!floor_.empty()){\\栈空时表示无法搜索可结束
		h=floor_.front();
		pass[h]=pass_.front();\\表示到达h层时所按电梯次数
		if(h+_floor[h]<=n&&pass[h+_floor[h]]==-1){
		floor_.push(h+_floor[h]);
		pass_.push(pass[h]+1);
		}
		if(h-_floor[h]>=1&&pass[h-_floor[h]]==-1){
		floor_.push(h-_floor[h]);
		pass_.push(pass[h]+1);
		}
		pass_.pop();
		floor_.pop();
		if(pass[b]!=-1)break;\\如果结论出来了就终止吧
	}
	cout<<pass[b];
	return 0;
}

回复

7 条回复,欢迎继续交流。

正在加载回复...