思路

看到n<16 整个坐标<100 肯定想到暴力啊

蒟蒻来一发最简单易懂的题解(因为不会DP哈

首先我们用map数组来存坐标图 **注意前面的坐标需要加1 **

因为输入的是坐标 而我们需要的是格子(后面同理)

随后一个结构体存下坐标和颜色 还有判断是否涂过

开始搜索时只要从最顶上的几个开始搜索

搜索时有两种情况

  • 当颜色一样时 就不用多算拿笔数
  • 当颜色不一样时 就要算拿笔数

加上个最优性剪枝可以跑得飞快 33ms

吐槽:这数据也太水了 本蒟蒻一开始判断写反了还有75分的说

代码

#include<iostream>
using namespace std;
#define maxn 110
int n,num,ans=1e9+7;
int map[maxn][maxn];//存图
struct sq
{
int x1;
int x2;
int y1;
int y2;
int col;
bool vis;//判断是否涂色
}a[21];
void cinn()
{
cin>>n;
for(int i=1;i<=n;i++)
{
cin>>a[i].x1>>a[i].y1>>a[i].x2>>a[i].y2>>a[i].col;
a[i].vis=0;
for(int j=a[i].x1+1;j<=a[i].x2;j++)
for(int k=a[i].y1+1;k<=a[i].y2;k++)
map[j][k]=a[i].col;//保存颜色
}
}
void add(int x)//涂色后为0
{
for(int j=a[x].x1+1;j<=a[x].x2;j++)
for(int k=a[x].y1+1;k<=a[x].y2;k++)
map[j][k]=0;
}
void del(int x)//清除涂色
{
for(int j=a[x].x1+1;j<=a[x].x2;j++)
for(int k=a[x].y1+1;k<=a[x].y2;k++)
map[j][k]=a[x].col;
}
int pd(int x)//判断上面是否涂色
{
for(int i=a[x].y1+1;i<=a[x].y2;i++)
if(map[a[x].x1][i]!=0) return 0;//如果上面有一格没涂就不能涂这格
return 1;
}
void dfs(int now,int sum,int cnt)
{
if(sum>ans) return;//最优性剪枝
if(cnt==n)//当所有矩形都涂色完成
{
ans=sum; //不用取最小值 因为前面的剪枝已经把大于最优解剪掉了
return;
}
for(int i=1;i<=n;i++)//枚举矩形
{
if(!a[i].vis&&pd(i))//如果这个矩形没有被涂色 且可以涂
{
if(a[i].col==a[now].col&&pd(i))//当颜色一样时
{
a[i].vis=1;
add(i);
dfs(i,sum,cnt+1);//拿笔数不用加1 而已涂矩形要加1
a[i].vis=0;
del(i);
}
if(a[i].col!=a[now].col&&pd(i))//当颜色不一样时
{
a[i].vis=1;
add(i);
dfs(i,sum+1,cnt+1);//都要加1
a[i].vis=0;
del(i);
} }
}
}
int main()
{
cinn();
for(int i=1;i<=n;i++)
{
if(!a[i].x1&&!a[i].vis)//只要从最上面开始搜索
{
a[i].vis=1;
add(i);
dfs(i,1,1);//先取第一个
a[i].vis=0;
del(i);
}
}
cout<<ans;
}

【题解】洛谷P1283 平板涂色(搜索+暴力)的更多相关文章

  1. 洛谷P1283 平板涂色 &&一本通1445:平板涂色

    题目描述 CE数码公司开发了一种名为自动涂色机(APM)的产品.它能用预定的颜色给一块由不同尺寸且互不覆盖的矩形构成的平板涂色. 为了涂色,APM需要使用一组刷子.每个刷子涂一种不同的颜色C.APM拿 ...

  2. P1283 平板涂色

    P1283 平板涂色 dfs 记忆化搜索 将矩阵转化为图求解,然后我们发现这是个DAG,于是就可以愉快地跑搜索了. 进行dfs时,我们可以用类似拓扑排序的方法.每次将上面所有矩形都被刷过(入度in[ ...

  3. 【算法•日更•第三十期】区间动态规划:洛谷P4170 [CQOI2007]涂色题解

    废话不多说,直接上题:  P4170 [CQOI2007]涂色 题目描述 假设你有一条长度为5的木版,初始时没有涂过任何颜色.你希望把它的5个单位长度分别涂上红.绿.蓝.绿.红色,用一个长度为5的字符 ...

  4. 洛谷 P4170 [CQOI2007]涂色

    题目描述 假设你有一条长度为5的木版,初始时没有涂过任何颜色.你希望把它的5个单位长度分别涂上红.绿.蓝.绿.红色,用一个长度为5的字符串表示这个目标:RGBGR. 每次你可以把一段连续的木版涂成一个 ...

  5. 洛谷P4170 [CQOI2007]涂色题解

    废话: 这个题我第一眼看就是贪心呐, 可能是我之前那做过一道类似的题这俩题都是关于染色的 现在由于我帅气无比的学长的指导, 我已经豁然开朗, 这题贪心不对啊, 当时感觉自己好厉害贪心都能想出来 差点就 ...

  6. 洛谷P4170 [CQOI2007]涂色(区间dp)

    题意 题目链接 Sol 震惊,某知名竞赛网站竟照搬省选原题! 裸的区间dp,\(f[l][r]\)表示干掉\([l, r]\)的最小花费,昨天写的时候比较困于是就把能想到的转移都写了.. // luo ...

  7. 题解 P1283 【平板涂色】

    P1283 平板涂色 数据范围也太小了qwq..适合本萌新暴搜 小小的剪枝: 1.用pre预处理出每块矩形上方的矩形,pre[i][0]记录数目(如果数据范围再开大一点,直接1~n枚举判断可能超时qw ...

  8. 题解 洛谷 P2010 【回文日期】

    By:Soroak 洛谷博客 知识点:模拟+暴力枚举 思路:题目中有提到闰年然后很多人就认为,闰年是需要判断的其实,含有2月29号的回文串,前四位是一个闰年那么我们就可以直接进行暴力枚举 一些小细节: ...

  9. 洛谷 P1162 填涂颜色题解

    题目描述 由数字00组成的方阵中,有一任意形状闭合圈,闭合圈由数字11构成,围圈时只走上下左右44个方向.现要求把闭合圈内的所有空间都填写成22.例如:6 \times 66×6的方阵(n=6n=6) ...

随机推荐

  1. CentOS 启动-运行级别

    Linux系统的启动过程:内核的引导 > 运行init > 系统初始化 > 建立终端 > 用户登录系统 运行init init 进程是系统所有进程的起点: 主要功能: 准备软件 ...

  2. Linux必会必知

    一.前言 Linux作为一个开源系统,被极客极力推崇,作为程序员不来了解一下,那就亏了 Linux是一种自由和开放源代码的类UNIX操作系统.该操作系统的内核由林纳斯·托瓦兹在1991年10月5日首次 ...

  3. java设计模式之装饰者模式学习

    装饰者模式 Decorator模式(别名Wrapper):动态将职责附加到对象上,若要扩展功能,装饰者提供了比继承更具弹性的代替方案. 装饰者与被装饰者拥有共同的超类,继承的目的是继承类型,而不是行为 ...

  4. nodejs繁琐地自建路由

    一.繁琐的自建路由 app.js var server = require('./server'); server.startServer(); server.js var http = requir ...

  5. 浮动的补充丶文本和字体属性丶background丶定位

    一丶浮动的补充 浮动的特性: 1. 浮动的元素脱标 2.浮动的元素互相贴靠 3.浮动的元素有"字围"效果 4.浮动的元素有收缩的效果 前提是标准文档流,margin的垂直方向会出现 ...

  6. 合并excel的多个sheet

    '合并excel的多个sheetSub 合并当前工作簿下的所有工作表()Application.ScreenUpdating = FalseFor j = 1 To Sheets.Count If S ...

  7. mui.ajax()和asp.net sql服务器数据交互【3】最终版

    1.前端页面 <header class="mui-bar mui-bar-nav"> <a class="mui-action-back mui-ic ...

  8. c++开发ocx入门实践三--基于opencv的简易视频播发器ocx

    原文:http://blog.csdn.net/yhhyhhyhhyhh/article/details/51404649  利用opencv做了个简易的视频播放器的ocx,可以在c++/c#/web ...

  9. Android Studio设置代码风格

    进入settings,然后搜索CodeStyle选择Java进入如下界面 scheme选择project

  10. redis 存取问题

    今天在写短信接口时候,要把验证码存到缓存里面.因为之前别人已经写的有案例,按照之前写的,获取 值.存到数据库,存到redis. 因为有过期时间,需要传过期时间.但是怎么都是不出来... 源码: @Ov ...