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;
}