#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
const int N = 210, inf = 0x3f3f3f3f;
int n, A, B;
int K[N];
int dis[N];
void dfs(int x, int step) {
if (x <= 0 || x > n) return;
if (dis[x] < step) return;
dis[x] = step;
if (x == B) return;
dfs(x + K[x], step + 1);
dfs(x - K[x], step + 1);
}
int main() {
scanf("%d%d%d", &n, &A, &B);
memset(dis, 0x3f, sizeof dis);
for (int i = 1; i <= n; i++) {
scanf("%d", &K[i]);
}
dfs(A, 0);
printf("%d", dis[B] == inf ? -1 : dis[B]);
return 0;
}
这个代码会TLE #1,刚开始我觉得是死循环,但是,做标记的那行的剪枝已经保证了不会有循环路径,而且相同的路径在搜索下是一定不会走1次以上的。所以应该就是剪枝力度问题(然后有反例不停钻空子),导致普通的效率过低,而不是死循环。
解决方法就是把标记那行的 < 改成 <=。