#include <bits/stdc++.h>
using namespace std;
int a[205],vis[205],res=205;
/*
(1) 为什么要设置vis 数组,之前搜过的东西,早就有答案了,如果再去搜,要么没有答案,要么答案小于之前搜过的答案
(2)注意第44行代码,调试了一阵时间才出结果
(3)套路都是差不多的,要注意细节。
*/
struct point
{
int now; // 现在的位置
int step; // 步数
};
queue <point> r;
int main()
{
int n, now, end;
cin >> n >> now >> end;
for(int i=1;i<=n;i++)
scanf("%d",&a[i]);
point start;
start.now = now; // 起始位置
vis[start.now] = 1;
start.step = 0;
r.push(start);
bool flag = false;
while(r.size())
{
if(r.front().now == end) // 更新答案
{
res = min(res, r.front().step);
flag = true;
}
int upp = r.front().now + a[r.front().now]; // 向上和向下走
int downn = r.front().now - a[r.front().now]; // 这里不是a[now] 而是,r.front().now
if(upp <= n && vis[upp] == 0)
{
point tmp;
tmp.now = upp;
tmp.step = r.front().step + 1;
r.push(tmp);
vis[upp] = 1;
}
if(downn >= 1 && vis[downn] == 0)
{
point tmp1;
tmp1.now = downn;
tmp1.step = r.front().step + 1;
r.push(tmp1);
vis[downn] = 1;
}
r.pop();
}
if(!flag) printf("-1");
else printf("%d",res);
return 0;
}
奇怪的电梯
最新推荐文章于 2023-12-26 06:15:00 发布