廣搜, 最短路徑也可以做。
#include <stdio.h>
#include <queue>
using namespace std;
#define MAX 205
struct node {
int floor, k;
int step;
};
int n, a, b;
node floors[MAX];
bool visited[MAX];
int flag;
int bfs() {
queue<node> Q;
node cur, next;
int upFloor, downFloor;
memset(visited, false, sizeof(visited));
visited[a] = true;
Q.push(floors[a]);
while (!Q.empty()) {
cur = Q.front();
Q.pop();
upFloor = cur.floor + cur.k;
downFloor = cur.floor - cur.k;
if (upFloor == b) {
return floors[cur.floor].step + 1;
} else if (downFloor == b) {
return floors[cur.floor].step + 1;
}
if (upFloor <= n && !visited[upFloor]) {
visited[upFloor] = true;
floors[upFloor].step = cur.step + 1;
Q.push(floors[upFloor]);
}
if (downFloor > 0 && !visited[downFloor]) {
visited[downFloor] = true;
floors[downFloor].step = cur.step + 1;
Q.push(floors[downFloor]);
}
}
return -1;
}
int main() {
int i;
int ans;
while (scanf("%d", &n) != EOF && n) {
scanf("%d%d", &a, &b);
for (i = 1; i <= n; i++) {
floors[i].floor = i;
floors[i].step = 0;
scanf("%d", &floors[i].k);
}
if (a == b) {
printf("0\n");
} else {
ans = bfs();
printf("%d\n", ans);
}
}
return 0;
}