HOJ 1548 A strange lift

深搜+剪枝
这里如果没有剪枝就会超时,过不了。需要考虑的是在搜索过程中,如果过程到达长度以经比目前已找到的最短长度要大的话,直接结束本次搜索,返回上一个节点

#include<iostream>
#include<cstring>
#define BIG 99999999
using namespace std;
const int MAXN = 201;
int a[MAXN], N, A, B, minTime;//a为每个楼层的Ki, N为每个例子中的层数,过程为从A到B
int vis[MAXN];//标记对应楼层是否到达过

void go(int k, int time) {
	if (time > minTime) return;//剪枝
	if (k == B) {
		if (time < minTime)
			minTime = time;
		return;
	}
	if (k + a[k] <= N && vis[k + a[k]] == 0) {
		vis[k + a[k]] = 1;
		go(k + a[k], time + 1);
		vis[k + a[k]] = 0;
	}
	if (k - a[k] > 0 && vis[k - a[k]] == 0) {
		vis[k - a[k]] = 1;
		go(k - a[k], time + 1);
		vis[k - a[k]] = 0;
	}
}

int main() {
	while ((cin >> N) && N) {
		cin >> A >> B;
		for (int i = 1; i <= N; i++)
			cin >> a[i];
		minTime = BIG;
		go(A, 0);
		if (minTime != BIG)
			cout << minTime << endl;
		else
			cout << "-1" << endl;
	}
}

猜你喜欢

转载自blog.csdn.net/qq_44724908/article/details/104006742