洛谷 P1135 奇怪的电梯 C语言 bfs

题目:

https://www.luogu.com.cn/problem/P1135#submit

我们会发现只走过一次楼层远比走过多次更快到达目标楼层,我画了个图,所以需要用状态数组标记已经走过的楼层。

之后就是简单的bfs格式,注意,上下楼要有两个分支,所以我使用两个if两个结构体类型的对象存探索出来的楼层,或者用一个数组exfloor储存上下楼层的值再进行判断是否越界。

代码如下:

复制代码
#include <iostream>
#include <climits>
#include<algorithm>
#include <cstring>
#include<queue>
using namespace std;
int N, A, B;
bool found;
int moves[10000];
bool stl[10000];
int exfloor[3];//临时储存探索楼层 
bool check(int n)//n为传过来的楼层,进行界限判断
{
	if(n <= N && n >= 1)
	return true;
	else
	return false;
 } 
struct Node{
	int floor;//当前楼层 
	int cnt; //使用按钮次数 
};
int main() 
{
    cin >> N >> A >> B; 
    for (int i = 1; i <= N; i++) 
        cin >> moves[i];
        
    queue <Node> q;//创建队列 
	Node start;
	start.floor = A;//初始楼层 
	start.cnt = 0;//初始次数 
	q.push(start);//压入队首 
	stl[A] = true;//初始楼层标记已访问
	 
	while(!q.empty())
	{
		int x = q.front().floor;//取出队首的当前楼层和使用按钮次数 
		int ans = q.front().cnt; 
		
		if(x == B)
		{
			found = true; 
			break;
		 } 
		
		exfloor[1] = x + moves[x];//上楼
		exfloor[2] = x - moves[x];//下楼
		
		for(int i = 1 ; i <= 2 ;i++)
		{
			if(check(exfloor[i]) && stl[exfloor[i]] == false)
			{
				stl[exfloor[i]] = true;//新楼层标记已访问 
				Node newfloor;//临时新楼层 
				newfloor.floor = exfloor[i];//探索楼层 
				newfloor.cnt = ans + 1;//按钮次数+1 
				q.push(newfloor);//压入队列 
			}
		 } 
	/*	if( x + moves[x] <= N && stl[x + moves[x]] == false)
		{
			Node pexfloor;//探索的新楼层 
			pexfloor.floor = x + moves[x];//更新楼层 
			pexfloor.cnt = ans + 1; //按钮次数加1 
			q.push(pexfloor); //压入队列 
			stl[pexfloor.floor] = true;//探索楼层已访问 
		}
		
		if(x - moves[x] >= 1 && stl[x - moves[x]] == false)
		{
			Node rexfloor;//探索的新楼层 
			rexfloor.floor = x - moves[x];//更新楼层 
			rexfloor.cnt = ans + 1; //按钮次数加1 
			q.push(rexfloor); //压入队列 
			stl[rexfloor.floor] = true;//探索楼层已访问 
		}*/
		q.pop();//出队首 
	}
	if(found)
	cout << q.front().cnt;
	else
	cout << -1;
    return 0;
}
相关推荐
吃好睡好便好9 小时前
在Matlab中绘制横直方图
开发语言·学习·算法·matlab
仰泳之鹅9 小时前
【C语言】自定义数据类型2——联合体与枚举
c语言·开发语言·算法
x_yeyue11 小时前
三角形数
笔记·算法·数论·组合数学
Mr. zhihao12 小时前
深入解析redis基本数据结构
数据结构·数据库·redis
念何架构之路12 小时前
Go语言加密算法
数据结构·算法·哈希算法
AI科技星13 小时前
《数学公理体系·第三部·数术几何》(2026 年版)
c语言·开发语言·线性代数·算法·矩阵·量子计算·agi
失去的青春---夕阳下的奔跑13 小时前
560. 和为 K 的子数组
数据结构·算法·leetcode
黎阳之光13 小时前
黎阳之光:以视频孪生重构智慧医院信息化,打造高标项目核心竞争力
大数据·人工智能·物联网·算法·数字孪生
丷丩14 小时前
三级缓存下MVT地图瓦片服务性能优化策略
算法·缓存·性能优化·gis·geoai-up
m0_6294947314 小时前
LeetCode 热题 100-----25.回文链表
数据结构·算法·leetcode·链表