头像

欢迎来到我的博客

分享题解与总结

P1135 奇怪的电梯

image

思路:

1.要求找“最少按几次按钮”

相当于找A到B的最短路

2.使用BFS,从A开始扩展

3.BFS主体:

遍历每一种可能——从当前楼层head到达下一楼层nxt

nxt取值于head+k[head]和head-k[head]

4.细节注意:

不需要增加"如果k[nxt]=0且nxt!=b就提前退出"的判断(加了反而可能有问题)

——意思是:卡在某一层,无法动弹(k[i]=0)的情况,不会使代码进入死循环

因为到达了第i层之后,stp[i]!=-1,之后i也无法入队,队列会逐渐变空,最终返回主函数

#include<bits/stdc++.h>
#define MAXN 205
using namespace std;
int n,a,b;
int k[MAXN],stp[MAXN]; 

void bfs()
{
	queue<int> q;
	int head,nxt;
	q.push(a);
	stp[a]=0;
	if(a==b||k[a]==0) return ;
	
	while(!q.empty()){
		head=q.front();
		q.pop();
		
		nxt=head+k[head];
		if(nxt<=n&&stp[nxt]==-1){
			q.push(nxt);
			stp[nxt]=stp[head]+1;
			if(nxt==b) return ;
		}
		
		nxt=head-k[head];
		if(nxt>0&&stp[nxt]==-1){
			q.push(nxt);
			stp[nxt]=stp[head]+1;
			if(nxt==b) return ;
		}
	}
}

int main()
{
	cin>>n>>a>>b;
	for(int i=1;i<=n;++i){
		scanf("%d",&k[i]);
		stp[i]=-1;
	}
	bfs();
	cout<<stp[b];
	return 0;
}
posted @ 2026-02-12 12:05  king_steph1209  阅读(11)  评论(0)    收藏  举报