您的位置:首页 > 其它

奇怪的电梯解题报告

2016-02-17 17:06 253 查看

问题描述

  简单来说就是当你在第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;
}

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: