点击查看代码
#include<bits/stdc++.h>
using namespace std;
const int MAXN = 205; // 题目说 N <= 200,稍微开大一点
int N, A, B; // 表示N层楼,起点和终点A和B
int K[MAXN]; // K[i] 表示这层楼的数字,可以向上或向下走的层数
int dist[MAXN]; // 既表示是否去过,又表示到达这一层的最小步数
int bfs() {
// 一个特判如果起点就是终点,步数为0
if (A == B) return 0;
// 1.初始化 dist 数组为 -1,表示所有楼层都没去过
//与启动队列,把起点放入队列并标记
memset(dist, -1, sizeof(dist));
queue<int> q;
q.push(A);
dist[A] = 0;
// 2. 开始循环
while (!q.empty()) {
//a取出
int u = q.front();
q.pop();
// 截止条件,已经到达终点B
if (u == B) return dist[u];
//b观察邻居,只有向上和向下两种选择
int up = u + K[u];
int down = u - K[u];
//c判断与入队,在限制之中,并且没去过
if (up <= N && dist[up] == -1) {
dist[up] = dist[u] + 1;
q.push(up);
}
if (down >= 1 && dist[down] == -1) {
dist[down] = dist[u] + 1;
q.push(down);
}
}
//3.队列为空依旧无法到达返回-1
return -1;
}
int main() {
cin >> N >> A >> B;
for (int i = 1; i <= N; i++) {
cin >> K[i]; // 读入每一层能跳的数字
}
// 调用 BFS 并输出结果
cout << bfs() << endl;
return 0;
}