如果你用DFS+剪枝并且TLE#1
查看原帖
如果你用DFS+剪枝并且TLE#1
324632
Skeleton_Huo楼主2023/3/30 12:33
#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次以上的。所以应该就是剪枝力度问题(然后有反例不停钻空子),导致普通的效率过低,而不是死循环。 解决方法就是把标记那行的 < 改成 <=

2023/3/30 12:33
加载中...