1360:奇怪的电梯(lift)
【问题描述】
有一天桐桐做了一个梦,梦见了一种很奇怪的电梯。大楼的每一层楼都可以停电梯,而且第i层楼(1≤i≤N)上有一个数字Ki(O≤Ki≤N)。电梯只有四个按钮:开,关,上,下。上下的层数等于当前楼层上的那个数字。当然,如果不能满足要求,相应的按钮就会失灵。例如:3 3 1 2 5代表了Ki (K1=3, K2=3,…),从一楼开始。在一楼,按“上”可以到4楼,按“下”是不起作用的,因为没有-2楼。那么,从A楼到B楼至少要按几次按钮呢?
【输入格式】
第1行为三个正整数,表示N,A,B(1≤N≤200,1≤A,B≤N);
第2行为N个正整数,表示Ki。
【输出格式】
1行,即最少按键次数,若无法到达,则输出-1。
【输入样例】
5 1 5
3 3 1 2 5
【输出样例】
3
1360:奇怪的电梯(lift) 《信息学奥赛一本通》
1360:奇怪的电梯(lift) 《信息学奥赛一本通》_dllglvzhenfeng的博客-CSDN博客
P1135 奇怪的电梯
C++参考代码一:
/*
第 5 课 奇怪的电梯(lift)
1360:奇怪的电梯(lift)03
http://ybt.ssoier.cn:8088/problem_show.php?pid=1360
*/
#include <bits/stdc++.h>
using namespace std;
int que[300][2];
int num[210];
int main( void )
{
int n,a,b;
cin>>n>>a>>b;
int head,tail;
int tempx,tempy,nx;
bool flag[210];
memset(flag,false,sizeof(flag));
for(int i=1;i<=n;++i)
{
//每层的数字
cin>>num[i];
}
//从当前层到当前层 特判
if( a == b )
{
cout<<0<<endl;
return 0;
}
head=0;
tail=1;
//入队
que[tail][0]=a;
que[tail][1]=0;//step
//flag表示已经走过
flag[a]=true;
while( head != tail)
{
//出队
++head;
tempx=que[head][0];
tempy=que[head][1];
for(int i=-1;i<=1;++i)
{
if( i != 0 )
{
nx=tempx+num[tempx]*i;
//nx>n 上溢
//nx<1 下溢
//flag[nx] 表示已经走过
if( nx>n || nx<1 || flag[nx] ) continue;
//break 跳出本层循环
//continue:跳出本次循环
if( nx == b )
{
cout<<tempy+1<<endl;
return 0;
}
//入队
++tail;
que[tail][0]=nx;
que[tail][1]=tempy+1;//按按钮的次增加1
//flag[nx] 标记为已经走过
flag[nx]=true;
}
}
}
cout<<-1<<endl;
return 0;
}
C++参考代码二:
/*
1360:奇怪的电梯(lift)--AC
http://ybt.ssoier.cn:8088/problem_show.php?pid=1360
*/
#include <bits/stdc++.h>
using namespace std;
int que[300][2];
int num[210];
int main( void )
{
int n,a,b;
cin>>n>>a>>b;
int head,tail;
int tempx,tempy,nx;
bool flag[210];
memset(flag,false,sizeof(flag));
for(int i=1;i<=n;++i)
{
//每层的数字
cin>>num[i];
}
//从当前层到当前层
if( a == b )
{
cout<<0<<endl;
return 0;
}
//head为空
head=0;
tail=1;
que[tail][0]=a;
que[tail][1]=0;//step
//flag表示已经走过
flag[a]=true;
//head==tail队列为空
//(tail+1)%n==head
//队空时: front=rear
//队满时: (rear+1)%maxsize=front
while( head != tail)
{
//出队
++head;
tempx=que[head][0];
tempy=que[head][1];
for(int i=-1;i<=1;++i)
{
if( i != 0 )
{
nx=tempx+num[tempx]*i;
//nx>n 上溢
//nx<1 下溢
//flag[nx] 表示已经走过
if( nx>n || nx<1 || flag[nx] ) continue;
//break 跳出本层循环
//continue:跳出本次循环
if( nx == b )
{
cout<<tempy+1<<endl;
return 0;
//exit(0);
}
//入队
++tail;
que[tail][0]=nx;
que[tail][1]=tempy+1;
//flag[nx] 标记为已经走过
flag[nx]=true;
}
}
}
cout<<-1<<endl;
return 0;
}
Python编程问题之奇怪的电梯
计算机是如何工作的 计算机原理
计算机科学速成课
发明机械硬盘的人真是个天才
没想到我们日常使用的固态硬盘,竟然蕴含着如此多的高科技
发明固态硬盘的人可真是个天才啊
不得不说,发明电脑的人真是个天才