题目
代码
思路大概都是很像的,只不过是细节上的处理需要注意
蓝桥杯上看不来了错误的数据,因此一定要把很多特殊情况都考虑到,这些特殊情况需要在平时的训练中总结思考
本题的细节有:
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;
}