上代码:
#include<iostream>
using namespace std;
bool bj[10000];//到过的楼层标记
int main(){
int n,//楼层总数
a,//起始位置
b;//终点位置
scanf("%d%d%d",&n,&a,&b); //输入三个数据
int k[n+10];//每一层楼上的电梯数字
for(int i = 1;i<=n;i++)
scanf("%d",&k[i]);//循环输入n层楼上的数字
if(a == b){//如果起始楼层就是结束楼层
printf("%d",0);//直接不用广搜输出0
return 0;//结束
}
int qe[10000];//广搜队列
int i = 0,//首位
j = 1;//末尾
qe[1] = a;//初始节点为开始楼层
bj[a] = 1;//标记初始节点走过
int sum = 0;//路线总长
while(i<j){//队列非空
i++;//i为树根,当前楼层
sum++;
//int jf = j;
for(int t = 1;t<=2;t++){//每一层有上与下两个选择
if(t == 1){//上
int f = qe[i]+k[qe[i]];
//到达楼层为当前楼层+该层数字
if(f <= n && bj[f] == 0){
//如果这一层没有越界且曾经没有到过
bj[f] = 1;//标记上,曾经来过
j++;//从尾部腾出空间
qe[j] = f; //入队
}
}else if(t == 1){//下
int f = qe[i]+k[qe[i]];
//到达楼层为当前楼层-该层数字
if(f > 0 && bj[f] == 0){
//如果这一层没有越界且曾经没有到过
bj[f] = 1;//标记上,曾经来过
j++;//从尾部腾出空间
qe[j] = f; //入队
}
}
if(qe[j] == b){//如果入队的节点就是目标节点
printf("%d",sum);//输出路线长度
return 0;//结束
}
}
// if(j > jf){//如果在这次上下中,有成员入队
// sum++;//将路程长度+1
// }
}
cout << -1;
//如果遍历所有节点,依旧无法到达终点,输出无解-1
return 0;//结束
}