首页 > 其他分享 >P1283 平板涂色

P1283 平板涂色

时间:2023-04-16 10:34:03浏览次数:71  
标签:平板 int void rest BLO 涂色 P1283 矩形 col

题目传送门

一看数据,是可以爆搜的。

思路

我们看,当要涂一个矩形的时候,他上面的矩形就都要涂掉
于是我们就可以自然而然的想到拓扑
或者说我们把整个平板抽象成一个有向图,每个矩形就是一个点,他的限制就是边

比如样例:

就可以抽象成

image

建图就可以暴力建,才100*100的数据

然后就在图上 dfs, 枚举颜色,用拓扑去尽量涂掉这个颜色的矩形

小剪枝:记录一个rest_col,为未涂完的颜色数量。如果当前答案加rest_col大于等于最优答案,必定不行,回溯。

代码

#include<bits/stdc++.h>
#define ll long long
#define ull unsigned long long
#define y1 yy1
#define pc putchar
using namespace std;
template<typename T>
inline void read(T &x)
{
    x=0;
    T f=1;
    char c=getchar();
    while(!isdigit(c)){if(c=='-')f=-1; c=getchar();}
    while(isdigit(c)){x=x*10+(c^48); c=getchar();}
    x*=f;
    return;
}
template<typename T,typename... Args> inline void read(T &x, Args&... args){read(x); read(args...);}
template<typename Z>
inline void write(Z x)
{
    if(x<0)putchar('-'),x=-x;
    if(x>9)write(x/10);
    putchar((x%10)^48);
}
template<typename Z,typename... Args> inline void write(Z x, Args... args){write(x); putchar(' '); write(args...);}
const int COL=20+5, BLO=16+5;
const int N=10000+5;
vector<int> e[N];
void add(int x,int y){e[x].push_back(y);}
int rest_col;//还有几种颜色没涂
int block[COL][BLO];//矩形的编号,第一维是颜色,第二维是编号
int cnt_block[COL];//这个颜色的矩形有多少个
int mp[100][100];//暴力建图
int ind[BLO];//每个矩形的入度
bool paint[BLO];//这个矩形是否已经被删除了
int col[BLO];//这个矩形的颜色是什么
int rest_block[COL];//这种颜色还剩下几个矩形没有涂
int ans=0x7fffffff;
void dfs(int pos)
{
    if(pos + rest_col >= ans) return;//剪枝,当前答案大于等于最优答案,必定不行
    if(rest_col == 0)//全都涂完了
    {
	ans = pos;
	return;
    }
    int cnt=0;
    for(int c=1; c<=20 && cnt < rest_col; c++)//枚举每种颜色
    {
	if(cnt_block[c] == 0 || rest_block[c] == 0) continue;//这个颜色的矩形没有或者涂完了
	bool can_paint = 0;//有没有能涂的
	queue<int> pain/*可以涂的矩形的队列*/, del/*涂掉的矩形的队列*/, ind_upd/*更改过入度的矩形的队列*/;
	for(int i=1;i<=cnt_block[c];i++)
	    if(!paint[block[c][i]] && ind[block[c][i]] == 0)//没被涂上色,没有入度,可以直接涂
	    {
		can_paint = 1;
		pain.push(block[c][i]);
	    }
	if(can_paint) cnt++;
	else continue;//这种色涂不上任何一个矩形
	while(!pain.empty())//拓扑
	{
            int x = pain.front();
	    pain.pop();
	    paint[x] = 1;
	    del.push(x);
	    rest_block[c]--;
	    for(auto t:e[x])
	    {
		ind[t]--;
		ind_upd.push(t);
		if(ind[t] == 0 && col[t] == c)//没有入度,颜色一样(不用换刷子
                    pain.push(t);
	    }
	}
	if(rest_block[c] == 0) rest_col--;//这种色的矩形全涂完了
	dfs(pos + 1);
	if(rest_block[c] == 0) rest_col++;//回溯
	while(!del.empty())
	{
	    paint[del.front()] = 0;
	    rest_block[c]++;
	    del.pop();
	}
	while(!ind_upd.empty())
	{
	    ind[ind_upd.front()]++;
	    ind_upd.pop();
	}
    }
}

int n,x1,y1,x2,y2,c;
int main()
{
    read(n);
    for(int i=1;i<=n;i++)
    {
	read(x1, y1, x2, y2, c);		
        rest_block[c]++;
	col[i] = c;
	if(cnt_block[c] == 0) rest_col++;
	cnt_block[c]++;
	block[c][cnt_block[c]] = i;
	for(int x=x1;x<=x2;x++)
	    for(int y=y1;y<=y2;y++)
		mp[x][y] = i;
    }
    for(int x=0;x<99;x++)
	for(int y=0;y<=99;y++)
	{
            int pre=0, nxt=0;
            if(mp[x][y] == mp[x+1][y]) continue;//同一个块
            if(!mp[x][y] || !mp[x+1][y]) continue;//不存在
            if(mp[x][y] != pre && mp[x+1][y] != nxt)//防止重复建边
	    {
		pre = mp[x][y];
		nxt = mp[x+1][y];
		add(pre, nxt);
		ind[nxt]++;
            }
	}
    dfs(0);
    write(ans);
    return 0;
}

标签:平板,int,void,rest,BLO,涂色,P1283,矩形,col
From: https://www.cnblogs.com/LittleN/p/17322600.html

相关文章

  • RK3399+麒麟工业平板解决方案
    1、RK3568Linux麒麟系统陀螺仪驱动调试瑞星微开发板自带的陀螺仪型号MXC6655xa,硬件人员说我们的板子和开发板一样,因此检查设备树文件找到设备描述:&i2c5{status=“okay”;mxc6655xa:mxc6655xa@15{status=“okay”;compatible=“gs_mxc6655xa”;......
  • 小米平板6pro参数
    小米平板6pro参数更新日期:2023-04-14来源:互联网手机扫码继续观看小米平板6Pro在用户的期待下终于要发布了,根据网上爆料出来的消息,我们已经大致可以了解到小米平板6Pro的参数配置了。但也有很多用户不清楚小米平板6Pro的参数配置有哪些。小米平板6pro参数1、有黑、白和蓝......
  • 2379. 得到 K 个黑块的最少涂色次数
    题目链接:2379.得到K个黑块的最少涂色次数方法一:前缀和解题思路通过前缀和计算任意子区间\([i,i+k-1]\)中字母\(W\)的数量,\(ans=min([i,i+k-1].count('W'),i=0,1,...)。\)代码classSolution{public:intminimumRecolors(stringblocks,intk......
  • 【触想智能】工业平板电脑触摸屏选择分析
    触摸屏是触摸显示面板,通常与液晶显示器配备触摸显示设备使用,比如工业平板电脑、工业一体机、工业安卓一体机等显示设备。工业平板电脑是一种带有触摸显示设备的工业控制计算机,其已被广泛应用于智能制造、城市交通、安防、商业金融、医疗等行业领域,在社会经济发展中发挥着......
  • 雷诺发布“汽车平板电脑”R-link
    法国汽车公司雷诺发布了所谓的平板电脑R-link,这其实是一种搭载Android系统的设备,有一个7英寸大小的触摸屏,可通过声音识别或方向牌上的按钮来对此进行操作,是专为汽车打造的一个媒体交互平台,虽然被称为“平板电脑”,但实际上不能从车上撤下。据雷诺首席数字官Patrick Hoffstetter......
  • 超炫白HTC概念平板
    此前国外著名设计师HasanKaymak给HTC设计过多款概念手机,各方面性能完全匹敌三星现有的旗舰机型,这一次再次为HTC设计了这款超炫的HTCOne概念平板。该平板设备采用HTCOne......
  • 给智能手机和平板用户新手的三个建议
    智能机时代的大门已经开启,每年都会有数以百万计的人摒弃功能机而选择智能机,然而,这些新手们总是会不时遇到各种各样的问题,如程序安装、应用选择等等。如何才能避免一些常见错......
  • 解密Amazon和B&N的平板策略
    有的时候,少就是多Amazon和Barnes均用简洁化的设计,用合理的价格切入市场,而更大一些的平板一般都在499美元这个水平。不过,虽然一些用户在极端状况下用iPad或者其他Android平......
  • Nielsen:69%平板电脑用户一边看电视一边上网
    什么?你不喜欢一边看电视一边上网,out了吧?据调查显示,随着平板电脑的越加普及,边上网边看电视的平板电脑用户的数量正在增大。这个月的早些时候,Nielsen发布了一份报告(第一部分),该......
  • 苹果吐槽:平板和笔记本合体如同烤箱和冰箱杂交
    “你可以将烤箱和冰箱合二为一,但是这很有可能会引起消费者的反感。”苹果CEO库克在财务报告会上开门见山对笔记本和平板的合体发表吐槽。由于Windows8操作系统对于不同的设......