luoguP1151
**1.**
#include <iostream>
using namespace std;
struct q_node { int floor; int num; };
q_node q[201];
int n, a, b, i, x; //n是总层数,a是起始层,b是终止层
int k[201]; bool visited[201];
int main()
{
//freopen("lift.in", "r", stdin);
//freopen("lift.out", "w", stdout);
cin >> n >> a >> b;
for (i=1; i<=n; i++) cin >> k[i];
if (a==b){ cout << 0; return 0; }
q[1].floor = a;
q[1].num = 0;
visited[a] = true;
f = 1; r = 1;
while (f<=r) { //BFS breadth-first search
temp = q[f].floor + k[q[f].floor];
if (temp<=n && !visited[temp]) { r++; q[r].floor = temp; q[r].num = q[f].num + 1; visited[temp] = true; if (temp==b) break; }
temp = q[f].floor - k[q[f].floor];
if (temp>0 && !visited[temp]) { r++; q[r].floor = temp; q[r].num = q[f].num + 1; visited[temp] = true; if (temp==b) break; }
f++;
}
if (f<=r) cout << q[r].num << endl;
else cout << -1 << endl;
//fclose(stdin);
//fclose(stdout);
return 0;
}
**2.**
#include <iostream>
#include <queue>
using namespace std;
struct q_node { int floor; int num; };
queue<q_node> q;
int n, a, b, i, x, temp;
q_node x, y; //n是总层数,a是起始层,b是终止层
int k[201];
bool visited[201];
int main() {
cin >> n >> a >> b;
for (i=1; i<=n; i++) cin >> k[i];
if (a==b){ cout << 0; return 0; }
x.floor = a;
x.num = 0; q.push(x);
visited[x.floor] = true;
while (!q.empty()) {
y = q.front();
x.floor = y.floor + k[y.floor];
x.num = y.num + 1;
if (x.floor<=n && !visited[x.floor]) {
q.push(x);
visited[x.floor] = true;
if (x.floor==b) break;
}
x.floor = y.floor - k[y.floor];
x.num = y.num + 1;
if (x.floor>=1 && !visited[x.floor]) {
q.push(x);
visited[x.floor] = true;
if (x.floor==b) break;
}
q.pop();
}
if (!q.empty()) cout << q.back().num << endl;
else cout << "-1" << endl;
return 0;
}