P1135 奇怪的电梯

思路:
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;
}

浙公网安备 33010602011771号