矩阵覆盖

题目描述

在平面上有 n 个点(n <= 50),每个点用一对整数坐标表示。例如:当 n=4 时,4个点的坐标分另为:p1(1,1),p2(2,2),p3(3,6),P4(0,7),见图一。

这些点可以用 k 个矩形(1<=k<=4)全部覆盖,矩形的边平行于坐标轴。当 k=2 时,可用如图二的两个矩形 sl,s2 覆盖,s1,s2 面积和为 4。问题是当 n 个点坐标和 k 给出后,怎样才能使得覆盖所有点的 k 个矩形的面积之和为最小呢。约定:覆盖一个点的矩形面积为 0;覆盖平行于坐标轴直线上点的矩形面积也为0。各个矩形必须完全分开(边线与顶点也都不能重合)。

输入输出格式

输入格式:

n k xl y1 x2 y2 ... ...

xn yn (0<=xi,yi<=500)

输出格式:

输出至屏幕。格式为:

一个整数,即满足条件的最小的矩形面积之和。

输入输出样例

输入样例#1:

4 2
1 1
2 2
3 6
0 7
输出样例#1:


/*
初始时,所有矩形的左下点坐标(+∞,+∞),右上角坐标(-∞,-∞)
然后按输入顺序,一个点一个点挨个搜
判断被搜的那个点是否被所有矩形覆盖了,如果有矩形没有覆盖这个点,
该矩形以最优解形式覆盖这个点(即这个点在矩形的边上),
每搜一个点后,就判断当前状态下,所有矩形是否没有覆盖,把不合法的废枝丢掉,提高效率
*/
#include <stdio.h>
#include <stdlib.h>
#define MAXN 100
#define INF 0x3f3f3f3f
int ans=INF,n,k;
struct point
{
int x;//该点的x坐标
int y;//该点的y坐标
}dots[MAXN];
struct square
{
struct point l; //左下角的点l
struct point r; //右上角的点r
}sqr[];
int checkit(int i,int j) //检查第i、j个矩形之间是否有冲突(即两个矩形有重叠区域)
{
if(sqr[i].l.x==INF||sqr[i].l.y==INF||sqr[i].r.x==-INF||sqr[i].r.y==-INF)
return ;
if(sqr[j].l.x==INF||sqr[j].l.y==INF||sqr[j].r.x==-INF||sqr[j].r.y==-INF)
return ;
if(sqr[i].l.x>sqr[j].r.x||sqr[i].l.y>sqr[j].r.y)
return ;
if(sqr[j].l.x>sqr[i].r.x||sqr[j].l.y>sqr[i].r.y)
return ;
return ;
}
int check() //检查当前所有已知矩形是否都合法。合法返回1
{
int i,j;
for(i=;i<k;i++)
{
for(j=i+;j<k;j++)
if(checkit(i,j))
return ;
}
return ;
}
int getsqr() //函数获取当前所有矩形覆盖面积之和
{
int i,ans=;
for(i=;i<k;i++)
{
if(sqr[i].l.x!=INF)
ans+=(sqr[i].r.x-sqr[i].l.x)*(sqr[i].r.y-sqr[i].l.y);
}
return ans;
}
void srch(int now) //寻找第now个点时矩形是否能覆盖
{
if(now==n) //搜索完成
{
ans=getsqr(); //获取当前所有矩形覆盖面积
return;
}
int i,j;
for(i=;i<k;i++) //从第0个矩形循环搜索到第k-1个矩形,判断矩形是否覆盖了点now
{
struct square tmp=sqr[i];
if(sqr[i].l.x>dots[now].x)
sqr[i].l.x=dots[now].x;
if(sqr[i].l.y>dots[now].y)
sqr[i].l.y=dots[now].y;
if(sqr[i].r.x<dots[now].x)
sqr[i].r.x=dots[now].x;
if(sqr[i].r.y<dots[now].y)
sqr[i].r.y=dots[now].y;
if(check()&&getsqr()<ans) //如果该步完成后,之前所有矩形都是合法的,且当前所有已求出的矩形面积比当前最优解小,则向深层(下一个点)搜索
srch(now+);
sqr[i]=tmp;
}
}
int main()
{
int i,j;
scanf("%d%d",&n,&k);
for(i=;i<n;i++)
scanf("%d%d",&dots[i].x,&dots[i].y);
for(i=;i<k;i++)
{
sqr[i].l.x=INF;
sqr[i].l.y=INF;
sqr[i].r.x=-INF;
sqr[i].r.y=-INF;
}
srch();
printf("%d",ans);
return ;
}

心若向阳,无谓悲伤

noip2002矩阵覆盖(搜索)的更多相关文章

  1. [LuoguP1034][Noip2002] 矩形覆盖

    [LuoguP1034][Noip2002] 矩形覆盖(Link) 在平面上有\(N\)个点,\(N\)不超过五十, 要求将这\(N\)个点用\(K\)个矩形覆盖,\(k\)不超过\(4\),要求最小 ...

  2. 【BZOJ2003】[HNOI2010]矩阵(搜索)

    [BZOJ2003][HNOI2010]矩阵(搜索) 题面 懒得粘了,不难找吧. 题解 看的学长写的题解,也懒得写了 大概是这样的. 不难发现只需要确定第一行和第一列就能确定答案,而确定第一行之后每确 ...

  3. 【校招面试 之 剑指offer】第10-3题 矩阵覆盖问题

    题目:我们可以使用2✖️1的小矩形横着或者竖着去覆盖更大的矩形.请问用8个2✖️1的小矩形无重叠地覆盖一个2✖️8的大矩形,共有多少种方法? 分析:当放第一块时(假定从左边开始)可以横着放,也可以竖着 ...

  4. c++刷题(21/100)树的打印、矩阵覆盖和括号生成

    题目一:把二叉树打印成多行 从上到下按层打印二叉树,同一层结点从左至右输出.每一层输出一行. 思路:一开始以为2维的vector可以直接访问,但是试了是不行,会报错,vector在有值之前不能直接访问 ...

  5. LeetCode第[79]题(Java):Word Search(矩阵单词搜索)

    题目:矩阵单词搜索 难度:Medium 题目内容: Given a 2D board and a word, find if the word exists in the grid. The word ...

  6. 【剑指offer】10矩阵覆盖

    原创博文,转载请注明出处! 0.简介 # 本文是牛客网<剑指offer>刷题笔记,笔记索引链接 1.题目 # 用2*1的小矩形横着或者竖着去覆盖更大的矩形.请问用n个2*1的小矩形无重叠地 ...

  7. 【剑指Offer】矩阵覆盖 解题报告(Python)

    [剑指Offer]矩阵覆盖 解题报告(Python) 标签(空格分隔): LeetCode 题目地址:https://www.nowcoder.com/ta/coding-interviews 题目描 ...

  8. NOIP2002 矩形覆盖

    题四 矩形覆盖(存盘名NOIPG4) [问题描述]: 在平面上有 n 个点(n <= 50),每个点用一对整数坐标表示.例如:当 n=4 时,4个点的坐标分另为:p1(1,1),p2(2,2), ...

  9. Hdu 1564 1*2矩阵覆盖棋局博弈

    n*n的矩阵如果n为偶数 则可被1*2的矩形完全覆盖 如果n为奇数 则除起点外 其他各自可被1*2矩形完全覆盖 所以当n为偶数 先手赢 n为奇数 后手赢 #include<bits/stdc++ ...

随机推荐

  1. 7-16 一元多项式求导(20 分)(有关while(scanf("%d",&n)!=EOF))

    7-16 一元多项式求导(20 分) 设计函数求一元多项式的导数. 输入格式: 以指数递降方式输入多项式非零项系数和指数(绝对值均为不超过1000的整数).数字间以空格分隔. 输出格式: 以与输入相同 ...

  2. Ubuntu 12.04 之 虚拟主机的配置

    Ubuntu 12.04 之 虚拟主机的配置 (1)打开etc/hosts文件 增加: 127.0.0.1 study.ubuntu.com 127.0.0.1 hello.ubuntu.com 12 ...

  3. Pagodas 等差数列

    nn pagodas were standing erect in Hong Jue Si between the Niushou Mountain and the Yuntai Mountain, ...

  4. 常用的delphi 第三方控件

    Devexpress VCL 这个基本上覆盖了系统界面及数据库展示的方方面面,是做桌面系统必备的一套控件,目前的版本是2011.2.3, 支持win32 及win64. AutoUpgrader 这个 ...

  5. HDU——1498 50 years, 50 colors

    50 years, 50 colors Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Othe ...

  6. 模拟用户点击弹出新页面不会被浏览器拦截_javascript技巧

    原文:http://www.html5cn.com.cn/article/zxzx/3195.html 相信用过window.open的小伙伴们都遇到过被浏览器拦截导致页面无法弹出的情况:我们换下思路 ...

  7. iphone的ibooks如何导入pdf?

    使用QQ把pdf文档从电脑上发到手机上,使用手机的QQ打开文档,在手机QQ上,用其他应用打开文档,选择‘拷贝’到ibooks

  8. linux程序命令行选项的3种风格:unix、gnu、x toolkit

    In Unix-like systems, the ASCII hyphen-minus is commonly used to specify options. The character is u ...

  9. fuse-dfs挂载hdfs实录

    部署安装了最新稳定版hadoop2.2.0.然后在网上找来fuse-dfs编译教程.可是最后失败了.至今原因未知--,错误描写叙述为:Transport endpoint is not connect ...

  10. 003 rip

    r0#config t Enter configuration commands, one per line.  End with CNTL/Z. r0(config)#router rip r0(c ...