// 164K 32MS C++
#include <cstdio>
#include <cstring>
#include <cstdlib>
using namespace std;
// int comp(const void * a,const void * b)
// {
// return *(int*)a-*(int*)b;
// }
struct Rectangle{
int x1, y1;
int x2, y2;
int color;
};
typedef struct Rectangle Rectangle;
const int MAX = 17;
int recNum;
Rectangle rectangles[MAX];
char paintedFlag[MAX];
#define INF 999999;
int minPickUpNum = INF;
void DFS(int paintedNum, int pickUpTime, int curPaintColor) {
// printf("DFS %d\n", paintedNum);
if (paintedNum == recNum) {
minPickUpNum = minPickUpNum < pickUpTime ? minPickUpNum: pickUpTime;
// printf("finsih %d\n", minPickUpNum);
return;
} else if (pickUpTime > minPickUpNum) {
return;
} else {
for (int i = 1; i <= recNum; i++) {
if (!paintedFlag[i]) {
char canPaint = 1;
for (int j = 1; j <= recNum; j++) {
if (j != i &&
!paintedFlag[j] &&
rectangles[i].y1 == rectangles[j].y2 &&
((rectangles[j].x1 >= rectangles[i].x2 && rectangles[j].x1 <= rectangles[i].x1) ||
(rectangles[j].x2 >= rectangles[i].x2 && rectangles[j].x2 <= rectangles[i].x1))
) {
canPaint = 0;
break;
}
}
if (canPaint) {
paintedFlag[i] = 1;
// printf("paint %d %d %d -> %d\n", i, paintedNum, curPaintColor, rectangles[i].color);
if (curPaintColor != rectangles[i].color) {
DFS(paintedNum + 1, pickUpTime + 1, rectangles[i].color);
} else {
DFS(paintedNum + 1, pickUpTime, curPaintColor);
}
paintedFlag[i] = 0;
}
}
}
}
}
void getMinPickUp() {
DFS(0, 0, -1);
printf("%d\n", minPickUpNum);
}
int caseNum;
int main() {
scanf("%d", &caseNum);
for (int i = 1; i <= caseNum; i++) {
scanf("%d", &recNum);
// printf("recNum %d\n", recNum);
memset(rectangles, 0, sizeof(rectangles));
memset(paintedFlag, 0, sizeof(paintedFlag));
minPickUpNum = INF
for (int i = 1; i <= recNum; i++) {
int x1, x2, y1, y2, color;
scanf("%d %d %d %d %d", &y1, &x1, &y2, &x2, &color);
rectangles[i].x1 = x2;
rectangles[i].y1 = y2;
rectangles[i].x2 = x1;
rectangles[i].y2 = y1;
rectangles[i].color = color;
}
getMinPickUp();
}
}
唉,简单的DFS,但是犯了不少低级错误。
一开始还以为要预先预处理下各个矩形,使得真正DFS的时候可以快捷些,但是一看题目给的矩形最大值只有15,就觉得不用预处理了,每次直接遍历所有的矩形时间应该也够用, 要注意的一点是,题目给的坐标系,y轴是反向的,并且输入的是 y x, 而不是 x y, 这些细节都要注意,至于真正的DFS时,就简单了,就是多了一些剪枝的条件罢了,
二逼的是在向一层DFS传递参数时,把把本层的参数也给变了,WA了好几次.