思路

看到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;
}

最新文章

  1. 阿里云服务器远程mysql连不上
  2. Android复习笔记--Intent
  3. iOS - nil null Nil笔记
  4. oracle中number类型的数据使用as string 得到的值为null
  5. shell脚本处理大数据系列之(一)方法小结
  6. 【虚拟化】支持IDE/SATA/SCSI
  7. json 和 pickel 详解
  8. 【转】安卓Fragment不完全介绍
  9. String及其常用API
  10. Perl初试
  11. C# .net 填充无效,无法被移除 微信小程序解密失败的解决办法
  12. js变速动画函数封装 回调函数及层级还有透明度
  13. ADB驱动
  14. LeetCode每天一题之两数之和
  15. 网络(socket)编程
  16. C# sapnco支持.net 4.5了,真是个意外的发现
  17. windows假装更新升级
  18. linux常用命令及系统常见符号
  19. linux命令1—安装optimizer
  20. 零基础读懂视频播放器控制原理——ffplay播放器源代码分析

热门文章

  1. 注册中心zookeeper-3.4.6集群以及高可用
  2. java设计模式之抽象工厂模式学习
  3. java设计模式-观察者模式学习
  4. mysql(什么是关系型数据库?)
  5. create-react-app找不到配置项
  6. chrome调试工具DevTools的使用 以及 localhost在移动端不能访问的问题
  7. Generic/Template Programming in Flink
  8. androidwebview网页显示事件
  9. 深入理解http协议的特点
  10. 网站的Information Architecture--构建一个最优用户体验的site structure