IDA*全 TLE 求助
查看原帖
IDA*全 TLE 求助
689810
2020luke楼主2024/3/16 14:12
#include<bits/stdc++.h>
using namespace std;
const int N = 20;
int n, lmt = 1, r[N];
bool flag = false;
int gete() {
	int cnt = 0;
	for(int i = 1; i <= n; i++) {
		cnt += (abs(r[i] - r[i + 1]) != 1);
	}
	return cnt;
}
void ida(int step, int e, int lst) {
//	cout << s.step << ' ' << lmt << ' ' << s.e << '\n';
	if(step + e > lmt || flag) return;
	if(e == 0) {
		flag = true;
		return;
	}
//	node nxt = now;
	for(int i = 2; i <= n; i++) {
		if(i == lst || abs(r[i] - r[i + 1]) == 1) continue;
		reverse(r + 1, r + i + 1);
//		if(abs(s.r[i] - s.r[i + 1]) == 1) s.e = s.e - 1;
		e = gete();
		ida(step + 1, e, i);
		if(flag) return;
//		if(abs(s.r[i] - s.r[i + 1]) == 1) s.e = s.e + 1;
		reverse(r + 1, r + i + 1);
	}
	return;
}
int main() {
	cin >> n;
	vector<int> v;
	for(int i = 1; i <= n; i++) {
		cin >> r[i];
		v.push_back(r[i]);
	}
	sort(v.begin(), v.end());
	v.erase(unique(v.begin(), v.end()), v.end());
	for(int i = 1; i < n; i++) {
		r[i] = lower_bound(v.begin(), v.end(), r[i]) - v.begin() + 1;
	}
	r[n + 1] = n + 1;
	while(lmt <= n * n) {
		ida(0, gete(), 1);
		if(flag) {
			cout << lmt << '\n';
			return 0;
		}
		lmt++;
	}
	return 0;
}
2024/3/16 14:12
加载中...