问题描述
简单来说就是当你在第i层时可以上i层下i层,问需要这样多少次能到达需要到的终点 n<=200
分析
楼层数不大,考虑最坏情况:所有楼层都走过了但还是没有到终点的复杂度:
因为走过的楼层不会再走,队列内最多只有200个元素,所以可以用广度优先搜索,每次搜索向上和向下两种情况,找到了想到的楼层就输出结束。
代码:
#include<iostream>
#include<cstdio>
#define MAXN 100000+20
using namespace std;
int num[MAXN];
int arr[MAXN];
int main(){
freopen("lift.in","r",stdin);
freopen("lift.out","w",stdout);
int que[10000+20];
int head=0,tail=0;
int n,from,to;
scanf("%d%d%d",&n,&from,&to);
for(int i=1;i<=n;i++)
scanf("%d",&num[i]);
que[++tail]=from;
arr[from]=0; //不走的时候是0
while(head<tail){
int &x=que[head+1];
if(x==to){
printf("%d",arr[x]);
return 0;
}
if((x+num[x]<=n) && ( !arr[x+num[x]])){ //上楼梯的情况
que[++tail]=x+num[x];
arr[x+num[x]]=arr[x]+1; //每走一次+1
}
if((x-num[x]>0) && ( !arr[x-num[x]])){ //下楼梯的情况
que[++tail]=x-num[x];
arr[x-num[x]]=arr[x]+1; //每走一次+1
}
head++;
} //搜索结束,没有答案就输出-1
printf("-1");
return 0;
}