poj 1691

#include<iostream>
#include<cstdio>
#include<string>
#include<cstring>
#include<string.h>
#include<algorithm>

using namespace std;
const int maxn = 15;
const int maxm = 20;
class node{
	public:
		int lx, ly, rx, ry, color;
};
int m, n;
node nn[maxn];
int mmin = 0x7fffffff;
int g[maxn][maxn];
int cnt[maxn];
bool visit[maxn];
int dfs(int dep, int sum, int color){
	if(sum > mmin){
		return 0;
	}
	if(dep == n){
		mmin = min(mmin, sum);
		return 0;
	}
	for(int i = 0; i < n; ++i){
		if(!visit[i] && cnt[i] == 0){
			visit[i] = true;
			for(int j = 0; j < n; ++j){
				if(g[i][j]){
					--cnt[j];
				}
			}
			if(color == nn[i].color){
				dfs(dep + 1, sum, color);
			}
			else{
				dfs(dep + 1, sum + 1, nn[i].color);
			}
			for(int j = 0; j < n; ++j){
				if(g[i][j]){
					++cnt[j];
				}
			}
			visit[i] = false;
		}
	}
	return 0;
}

bool isjudge(int i, int j){
	if(nn[i].rx != nn[j].lx) return false;
	if(nn[i].ry <= nn[j].ly) return false;
	if(nn[i].ly >= nn[j].ry) return false;
	return true;
}
int main(){
	int tmplx, tmply, tmprx, tmpry, tmpcolor;
	scanf("%d", &m);
	int num = 0;
	while(m--){
		//cout << "m is " << m << endl;
		memset(cnt, 0, sizeof(cnt));
		memset(visit, 0, sizeof(visit));
		memset(g, 0, sizeof(g));
		num = 0;
		mmin = 0x7fffffff;
		scanf("%d", &n);
		for(int i = 0; i < n; ++i){
			scanf("%d%d%d%d%d", &nn[i].lx, &nn[i].ly, &nn[i].rx, &nn[i].ry, &nn[i].color);
		}
		//建立有向无环图
		for(int i = 0; i < n; ++i){
			for(int j = 0; j < n; ++j){
				if(isjudge(i, j)){
					g[i][j] = 1;
					cnt[j]++;
				}
			}
		}
		dfs(0, 0, 0);
		printf("%d\n",mmin);
	}
	return 0;
}
时间: 2024-08-29 16:35:35

poj 1691的相关文章

poj 1691 Painting A Board 拓扑序+dfs

题意: 一个木板上被分成了很多区域,每个区域要涂上一种特定的颜色,当涂一个区域的时候,它上方与它有重合部分的区域必须之前要涂好.求最少需要拿几次画笔(拿一次画笔可以涂颜色相同的多个区域). 分析: 上方与它有重合部分的区域必须之前要涂好这个限制可以用拓扑序来描述,每次涂有很多种可以涂的颜色,dfs就可以了.dfs的状态空间维数定为拿笔的次数,每次枚举可以涂的颜色.要注意的是dfs过程中要慎用全局变量..否则每个维度需枚举的东西被下一维改了就跪了... 代码: //poj 1691 //sep9

POJ 1691 Painting A Board(DFS)

链接 题意 : 看了好长时间终于看懂题目了,将一个大矩形划分成若干小矩形,告诉你每个小矩形的左上角那个点和右下角那个点的坐标,告诉你这个小矩形要涂的颜色,每个颜色对应一个刷子,问你最少要使用几次刷子.因为你要刷一个矩形之前,必须把这个矩形上方与之直接相邻的所有矩形先刷掉才能刷这个,如果你先用了红色的刷子,然后又用了蓝色的刷子,最后又用了红色的刷子,这算是3次使用而不是两次,样例中,用红色刷B所以D也可以刷了,用蓝色先刷A,然后可以刷C,因为B刷了所以E也可以刷了,最后换刷子把剩下的刷掉,总共三次

POJ 1691 Painting A Board

题目大意: 墙上有一块区域被分成了n个矩形,每个矩形要涂上各自的颜色.为了保证完美要求这一块区域可以进行涂色的条件是它上方的所有区域都已经涂好颜色,这样就不会有后续的操作影响这块区域的颜色.但是如果两块区域颜色不同就要换涂颜色用的刷子.问最少需要换几次. 解题思路: 区域涂色的大体次序是由拓扑排序决定的,当有多个区域在同一层次时需要枚举这些区域来保证换刷子的次数最小. 下面是代码: #include <stdio.h> #include <stdlib.h> struct node

[poj 1691] Painting A Board dfs+拓扑排序

Painting A Board Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 3611 Accepted: 1795 Description The CE digital company has built an Automatic Painting Machine (APM) to paint a flat board fully covered by adjacent non-overlapping rectangle

poj - 1691 - Painting A Board(状态压缩dp)

题意:N(1 <= N <= 15)个矩形,每个矩形要涂上指定的颜色C(1 <= C <= 20),如果给一个矩形涂色,那么与它相邻的上方矩形必须已经涂色,问最少要取几次画笔. 题目链接:http://poj.org/problem?id=1691 -->>状态:dp[S][color] 表示达到状态 S 且最后一次涂色为 color 时的最小取画笔数 状态转移方程:dp[S][color] = min(dp[S][color], dp[sub][i]); 或者 dp[

POJ - 1691 Painting A Board (状态压缩 + 暴力)

题目大意:要将一个大矩形內的所有小矩形涂色,涂色要求,只有该矩形上面的所有矩形都涂色了才可以涂该颜色,换一种填涂的颜色就要花费一点体力值,问填涂完需要花费的最小体力值 解题思路:先处理一下填涂该矩形的前提条件,我用了一个can数组表示填涂该矩形时要满足的状态量 用dp[color][state]表示当前用的颜色是color,填涂的状态为state时所用的最少体力值 然后暴力得出转换和结果 #include<cstdio> #include<cstring> #include<

POJ题目分类推荐 (很好很有层次感)

著名题单,最初来源不详.直接来源:http://blog.csdn.net/a1dark/article/details/11714009 OJ上的一些水题(可用来练手和增加自信) (POJ 3299,POJ 2159,POJ 2739,POJ 1083,POJ 2262,POJ 1503,POJ 3006,POJ 2255,POJ 3094) 初期: 一.基本算法: 枚举. (POJ 1753,POJ 2965) 贪心(POJ 1328,POJ 2109,POJ 2586) 递归和分治法. 递

POJ 刷题指南

OJ上的一些水题(可用来练手和增加自信) (POJ 3299,POJ 2159,POJ 2739,POJ 1083,POJ 2262,POJ 1503,POJ 3006,POJ 2255,POJ 3094) 初期: 一.基本算法: 枚举. (POJ 1753,POJ 2965) 贪心(POJ 1328,POJ 2109,POJ 2586) 递归和分治法. 递推. 构造法.(POJ 3295) 模拟法.(POJ 1068,POJ 2632,POJ 1573,POJ 2993,POJ 2996) 二

POJ1691平板涂色

题目描述 原题来自:POJ 1691 CE 数码公司开发了一种名为自动涂色机(APM)的产品.它能用预定的颜色给一块由不同尺寸且互不覆盖的矩形构成的平板涂色. 为了涂色,APM 需要使用一组刷子.每个刷子蘸了颜色 C .APM 拿起一把蘸有颜色 C 的刷子,并给所有颜色为 C 的矩形涂色.请注意,涂色有顺序要求:为了避免颜料渗漏使颜色混合,一个矩形只能在所有紧靠它上方的矩形涂色后,才能涂色.例如图中矩形 F 必须在 C 和 DDD 涂色后才能涂色.注意,每一个矩形必须立刻涂满,不能只涂一部分.