BFS 洛谷奇怪的电梯

本文介绍了一种使用广度优先搜索(BFS)解决蓝桥杯竞赛中的电梯移动问题。题目要求考虑多种特殊情况,如不超过楼层限制、未走过楼层、电梯停运等。代码中展示了如何通过BFS遍历所有可能的移动路径,并优化了处理开始点的逻辑,确保不会回到起点。通过这个实例,读者可以学习到如何在实际编程竞赛中处理复杂条件和边界情况。
摘要由CSDN通过智能技术生成

题目

题目链接

代码

思路大概都是很像的,只不过是细节上的处理需要注意
蓝桥杯上看不来了错误的数据,因此一定要把很多特殊情况都考虑到,这些特殊情况需要在平时的训练中总结思考
本题的细节有:
1.走到的楼层不能超过限度
2.该楼层需要没有被走过
3.可能在某层但是往下走的步数为0
4.刚开始的步数永远是一个坑点,需要单独考虑
如果不对开始点操作的话,很可能会走出去然后又回到起始点

#include<iostream>
#include<queue>

using namespace std;


queue <int> q;//存储在哪一层 

const int N=220;
int n,a,b;
int g[N][2];
int num[N];//用于判断走过的步数 


void bfs(int start,int end){
	q.push(start);
	while(!q.empty()){
		auto m=q.front();
		q.pop();
		for(int i=0;i<2;i++){
			int new_start=m+g[m][i];
			if(new_start>=1&&new_start<=n&&num[new_start]==0&&new_start!=m&&new_start!=start){
				/*
				这里判断的是:
					1.走到的楼层不能超过限度
					2.该楼层需要没有被走过
					3.可能某层电梯走不动,那么你不能增加步数啊,不过就算不要这个,
					  也会因为之前到达过这里而不再统计(开始就不能动的情况我们也考虑了) 
					4.因为到达开始的步数一直为0,所以很可能会出现+a,-a之后又到达开始的点,
					  这样就需要判断一下new_start!=start(永远也不会回到起始点)
					  不过也可以直接在输出的时候让b==a的情况输出0 
				*/
				q.push(new_start);
				num[new_start]=num[m]+1;
			}
		}	
	}
}

int main(){
	cin>>n>>a>>b;
	for(int i=1;i<=n;i++){
		cin>>g[i][0];
		g[i][1]=-1*g[i][0];
	}
	bfs(a,b);
	if(num[b]!=0||b==a)
		cout<<num[b];
	else
		cout<<-1;
	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值