poj-1691

7 篇文章 0 订阅
// 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了好几次.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值