奇怪的电梯解题报告
问题描述
简单来说就是当你在第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;
}
- PHP之数据分组
- c#中abstract、override、new、virtual、sealed使用和示例
- c语言实现去除代码中的注释
- libcurl - curl_easy_perform 返回值说明
- Orchard基本概念快速理解
- 【运动传感器】Madgwick算法(上)
- JAVA构造函数的调用
- 优步UBER司机全国各地最新奖励政策汇总(持续更新...)
- SOAP消息的结构
- java netty之ServerBootstrap的启动
- IntelliJ IDEA 14 利用JRebel实现热部署 二
- 使用Codis来部署Redis集群
- 系统的动态性能比较_20160213
- iOS中arc的设置与使用
- [css3动画教程]:逐帧自适应精灵图
- 【WEB前端】IE浏览器重复提交表单解决办法
- 360浏览器重复提交多次问题
- IOS如何使用LaunchImage
- Redis分布式锁实现原理 java版
- 通信之进程间通信-AIDL