平板涂色

CE数码公司开发了一种名为自动涂色机(APM)的产品。它能用预定的颜色给一块由不同尺寸且互不覆盖的矩形构成的平板涂色。

为了涂色,APM需要使用一组刷子。每个刷子涂一种不同的颜色C。APM拿起一把有颜色C的刷子,并给所有颜色为C且符合下面限制的矩形涂色:

为了避免颜料渗漏使颜色混合,一个矩形只能在所有紧靠它上方的矩形涂色后,才能涂色。例如图中矩形F必须在C和D涂色后才能涂色。注意,每一个矩形必须立刻涂满,不能只涂一部分。

写一个

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cstring>
 4 using namespace std;
 5 const int maxn=17;
 6 const int INF=0x7f7f7f7f;
 7 int map[maxn][maxn],dgr[maxn],vis[maxn];
 8 struct Tab{
 9   int x1,y1,x2,y2,col;
10 }tab[maxn];
11 int ans=INF;
12 int n;
13 void pre(){
14   for(int i=1;i<=n;i++){
15     for(int j=1;j<=n;j++){
16       if(tab[i].y2==tab[j].y1&&((tab[i].x1>=tab[j].x1&&tab[i].x1<=tab[j].x2)||
17                                 (tab[i].x2>=tab[j].x1&&tab[i].x2<=tab[j].x2)||
18                                 (tab[i].x1>=tab[j].x1&&tab[i].x2<=tab[j].x2)||
19                                 (tab[i].x1<=tab[j].x1&&tab[i].x2>=tab[j].x2)
20                                 )){
21                                   map[i][j]=1;dgr[j]++;
22                                 }
23     }
24   }
25 }
26 void dfs(int cnt,int stp,int color){
27   if(stp>=ans) return;
28   if(cnt==n){ans=min(ans,stp);return;}
29   for(int i=1;i<=n;i++){
30     if(!vis[i]&&!dgr[i]){
31       vis[i]=true;
32       for(int j=1;j<=n;j++) if(map[i][j]) dgr[j]--;
33       if(tab[i].col==color) dfs(cnt+1,stp,tab[i].col);
34       else dfs(cnt+1,stp+1,tab[i].col);
35       vis[i]=false;
36       for(int j=1;j<=n;j++)
37       if(map[i][j]) dgr[j]++;
38     }
39   }
40 }
41
42 int main(){
43   cin>>n;
44   for(int i=1;i<=n;i++){
45     cin>>tab[i].y1>>tab[i].x1>>tab[i].y2>>tab[i].x2>>tab[i].col;
46   }
47   pre();
48   dfs(0,0,0);
49   cout<<ans<<endl;
50   return 0;
51 } 

程序求一个使APM拿起刷子次数最少的涂色方案。注意,如果一把刷子被拿起超过一次,则每一次都必须记入总数中。

原文地址:https://www.cnblogs.com/lcan/p/9643220.html

时间: 2024-08-30 13:11:14

平板涂色的相关文章

P1283 平板涂色

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

POJ1691平板涂色

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

[算法小练][图][拓扑排序+深度优先搜索] 平板涂色问题

说在前面 本题是一道经典题目,多做经典题目可以节省很多学习时间,比如本题就包含了许多知识:回溯+剪枝+拓扑排序+深度优先搜索.[动态规划方法另作讨论] 关键代码 题: CE数码公司开发了一种名为自动涂色机(APM)的产品.它能用预定的颜色给一块由不同尺寸且互不覆盖的矩形构成的平板涂色. 为了涂色,APM需要使用一组刷子.每个刷子涂一种不同的颜色C.APM拿起一把有颜色C的刷子,并给所有颜色为C且符合下面限制的矩形涂色: 为了避免颜料渗漏使颜色混合,一个矩形只能在所有紧靠它上方的矩形涂色后,才能涂

【题解】 P1283 平板涂色

~先看题目内容:1. 给出了N的范围 N **< 16** and 0 < x,y < 1002. 颜色号为**不小于20的整数** 前者明示了我们这题可使用搜索做法 而非常有意思的是题目中并没有给出颜色号的具体数目 同时也说明了**存在存在颜色号1 与 3 却并不存在2的情况** 应该在代码中注意写法_(:зゝ∠)_ ------------ 不难构建出一个代码结构 用结构体存储各个矩形数据```cppstruct node{int lx, ly, rx, ry, color;} f[

#10023. 「一本通 1.3 练习 2」平板涂色

#include<bits/stdc++.h> #define lop(x,m,n) for(int x=m;x<=n;x++) using namespace std; int n; struct node{ int x1,y1,x2,y2,se; }sq[20]; int used[20]={0}; int maxx,maxy; bool b[40][40]={0}; void init() { maxx=-1,maxy=-1; scanf("%d",&n

BZOJ 1260 [CQOI2007]涂色paint(区间DP)

[题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=1260 [题目大意] 假设你有一条长度为n的木版,初始时没有涂过任何颜色 每次你可以把一段连续的木版涂成一个给定的颜色,后涂的颜色覆盖先涂的颜色 求最少的涂色次数达到目标状态 [题解] dp[i][j]表示涂抹i到j的最优答案, 显然当i和j相同时,可以从i+1……j,i……j-1,i+1……j-1转移过来, 同时也可以从两个区间组合得到. [代码] #include <cstdio>

POJ 1129 Channel Allocation(暴力搜--涂色问题)

Channel Allocation Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 13295   Accepted: 6806 Description When a radio station is broadcasting over a very large area, repeaters are used to retransmit the signal so that every receiver has a s

BZOJ 1260: [CQOI2007]涂色paint( 区间dp )

区间dp.. dp( l , r ) 表示让 [ l , r ] 这个区间都变成目标颜色的最少涂色次数. 考虑转移 : l == r 则 dp( l , r ) = 1 ( 显然 ) s[ l ] == s[ l + 1 ] 则 dp( l , r ) = dp( l + 1 , r )     s[ r ] == s[ r - 1 ] 则 dp( l , r ) = dp( l , r - 1 )  因为只要在涂色时多涂一格就行了, 显然相等 , 所以转移一下之后更好做 s[ l ] == s

HDU 4365 正方形格子涂色中心对称轴对称的涂法有多少种-思维-(矩阵坐标关系&amp;快速幂取模)

题意:n*n的格子,涂色,有k种颜料,必须满足旋转任意个90度和翻转之后图片的样子不变,现在已经有m个格子涂过色了,问还有多少种涂法满足上述条件. 分析: 满足上述对称条件,那么涂色的种类问题我们可以放在正方形的一个角来做,因为一个角确定了其他角的颜色也就确定了. 以左上角的下半角为例.共有1+2+....+(n+1)/2个格子,然后记录涂过色的格子对应到这个三角形里的格子数目,用tot来记录,即每输入一个涂过色的格子的坐标我们就在这个三角形里找与之对应的坐标,用vis[][]数组标记是否已经计