64pts剪枝求调
查看原帖
64pts剪枝求调
759274
Stevehim楼主2023/4/21 22:46

rt,昨天打了一发爆搜没过,今天剪枝也不行,感觉像check函数出了问题但又不知道哪里错了。

#include <bits/stdc++.h>
#define maxn 510
using namespace std;
struct node {
	int xa, ya, xb, yb;
	int c;
} a[maxn];
int n;
bool vis[maxn];
bool book[maxn][maxn];
int ans = 114514191;

bool check(int a1) { //检测一个点是否能够涂色
	int y = a[a1].ya - 1; //检测上方
	for (int i = a[a1].xa; i <= a[a1].xb; i++) { //枚举
		if (!book[y][i]) return false; //第y行有个没有
	}
	return true;
}

void dye(int a1) {
	for (int i = a[a1].xa; i <= a[a1].xb; i++) {
		for (int j = a[a1].ya; j <= a[a1].yb; j++) {
			book[j][i] = true;
		}
	}
	return;
}

void jie_dye(int a1) {
	for (int i = a[a1].xa; i <= a[a1].xb; i++) {
		for (int j = a[a1].ya; j <= a[a1].yb; j++) {
			book[j][i] = false;
		}
	}
	return;
}

bool check2() {
	for (int i = 1; i <= n; i++) {
		if (!vis[i])return false;
	}
	return true;
}

void dfs(int x, int sum, int fin) { //sum记录总次数
	if (sum >= ans) return;
	if(fin == n) ans = min(ans,sum);
	for (int i = 1; i <= n; i++) {
		if (!vis[i] && check(i)) {
			if (a[i].c == a[x].c) {
				vis[i] = true;
				dye(i); //染色
				dfs(i, sum,fin+1);
				vis[i] = false;
				jie_dye(i); //解除染色
			} else { //不等于结果需要加一
				vis[i] = true;
				dye(i);
				dfs(i, sum + 1,fin+1);
				vis[i] = false;
				jie_dye(i);
			}
		}
	}
}

void init() {
	memset(book, false, sizeof(book));
	memset(vis, false, sizeof(vis));
	for (int i = 0; i <= n + 1; i++) {
		book[0][i] = true;
	}
}

int main() {
// 	freopen("1.in", "r", stdin);
	cin >> n;
	for (int i = 1; i <= n; i++) {
		cin >> a[i].ya >> a[i].xa >> a[i].yb >> a[i].xb >> a[i].c;
		a[i].ya += 1;
		a[i].yb += 1;
		a[i].xa += 1;
		a[i].xb += 1;
	}
	for (int i = 1; i <= n; i++) {
		init();
		if (check(i)) {
//			cout << i << endl;
			dye(i);
			vis[i] = true;
			dfs(i, 0, 1);
		}
	}
	cout << ans + 1;
	return 0;
}
2023/4/21 22:46
加载中...