https://www.luogu.org/problem/P1135
题目描述
呵呵,有一天我做了一个梦,梦见了一种很奇怪的电梯。大楼的每一层楼都可以停电梯,而且第i层楼(1≤i≤N)上有一个数字 K i ( 0 ≤ K i ≤ N ) K_i(0 \le K_i \le N) Ki(0≤Ki≤N)。电梯只有四个按钮:开,关,上,下。上下的层数等于当前楼层上的那个数字。当然,如果不能满足要求,相应的按钮就会失灵。例如:3,3,1,2,5代表了 K i ( K 1 = 3 , K 2 = 3 , … ) K_i(K_1=3,K_2=3,…) Ki(K1=3,K2=3,…),从1楼开始。在1楼,按“上”可以到4楼,按“下”是不起作用的,因为没有−2楼。那么,从A楼到B楼至少要按几次按钮呢?
输入格式
共二行。
第一行为3个用空格隔开的正整数,表示N,A,B(1≤N≤200,1≤A,B≤N)。
第二行为N个用空格隔开的非负整数,表示 K i K_i Ki。
输出格式
一行,即最少按键次数,若无法到达,则输出−1。
输入输出样例
输入 #1
5 1 5
3 3 1 2 5
输出 #1
3
代码
#include<cstdio>
#include<iostream>
using namespace std;
int n,st,ed,p=0,i,j;
//st start 开始
//ed end 结束
int step[210],lift[210];
//step 步数 到第i层已经按了多少次?
//lift 电梯 第i层的按键显示是多少?
bool pd=true;//pd=true 能走 否则不能走
int main()
{
scanf("%d %d %d",&n,&st,&ed);
for(i=1;i<=n;i++)
{
step[i]=-1;
//我在这里先将步数设成-1
//-1表示没走过
scanf("%d",&lift[i]);
//电梯可上(下)层数
}
step[st]=0;
//开始步数为0
while(step[ed]==-1 && pd)
//当最后一层没有被访问过
//pd在下面有解释
{
pd=false;//先假设不能走了
for(i=1;i<=n;i++)//一层一层模拟
if(step[i]==p) //第一次p是0,step[st]开始运行 后面p的作用大了
{
j=i+lift[i];//模拟上楼
if(j<=n && step[j]==-1)//没有超过n层楼并且没走过
{
step[j]=p+1;//如果走这里那么下一次就找这层
pd=true;//能走 如果不能走的话就下一层for 假设死循环则pd=false,跳出while
}
j=i-lift[i];//模拟下楼
if(j>0 && step[j]==-1)//没有到地下并且没走过
{
step[j]=p+1;
pd=true;//同上楼的做法
}
}
p++;//下一层
}
printf("%d",step[ed]);//没走过的话step[ed]没发生变化 所以就还是-1 发生变化的话就输出步数
return 0;
}