题目描述
一栋有 N 层的大楼中有一部奇怪的电梯,每层只有上下两个钮,且第 i 层只能一次性上或下 Xi 层(若下 Xi 层后,层数小于 1 ,则不可进行下楼操作,同理有些层也不可进行上楼操作),小明现在在 A 层,他想去 B 层,求他需要的最少操作次数,若无法到达,则输出 −1。
输入
第一行输入三个整数 N,A,B。(1≤A,B≤N≤200)
接下来 N 行,每行一个数表示 Xi。(1≤Xi≤N)
输出
输出最小操作次数,若无法抵达则输出 −1。
样例输入
5 1 5
3
3
1
2
5
样例输出
3
数据规模与约定
时间限制:1 s
内存限制:256 M
100% 的数据保证 1≤A,B≤N≤200
#include <iostream>
#include <queue>
using namespace std;
struct node {
int level, step;
};
int main() {
int n, a, b;
cin >> n >> a >> b;
if (a == b) {
cout << 0 << endl;
return 0;
}
queue<node> que;
int num[205] = { 0 },mem[205]={0};
for (int i = 1; i <= n; i++) {
cin >> num[i];
}
que.push({ a,0 });
mem[a] = 1;
while (!que.empty()) {
node temp = que.front();
que.pop();
int up = temp.level + num[temp.level];
int down = temp.level - num[temp.level];
if (up >= 1 && up <= n) {
if (up == b) {
cout << temp.step + 1 << endl;
return 0;
}
if (!mem[up]) {
mem[up] = 1;
que.push({ up,temp.step + 1 });
}
}
if (down >= 1 && down <= n) {
if ( down == b) {
cout << temp.step + 1 << endl;
return 0;
}
if (!mem[down]) {
mem[down] = 1;
que.push({ down,temp.step + 1 });
}
}
}
cout << -1 << endl;
return 0;
}