Treasure Map


Time Limit: 2 Seconds      Memory Limit: 32768 KB


Your boss once had got many copies of a treasure map. Unfortunately, all the copies are now broken to many rectangular pieces, and what make it worse, he has lost some of the pieces.
Luckily, it is possible to figure out the position of each piece in the original map. Now the boss asks you, the talent programmer, to make a complete treasure map with these pieces. You need to make only one complete map and it is not necessary to use all
the pieces. But remember, pieces are not allowed to overlap with each other (See sample 2).

Input

The first line of the input contains an integer T (T <= 500), indicating the number of cases.

For each case, the first line contains three integers n m p (1 <= nm <= 30, 1 <= p <= 500), the width and the height of the map, and the number of
pieces. Then p lines follow, each consists of four integers x1 y1 x2 y2 (0 <= x1 < x2 <= n, 0 <= y1 < y2 <= m), where (x1, y1) is the coordinate of the lower-left corner of the rectangular
piece, and (x2, y2) is the coordinate of the upper-right corner in the original map.

Cases are separated by one blank line.

Output

If you can make a complete map with these pieces, output the least number of pieces you need to achieve this. If it is impossible to make one complete map, just output -1.

Sample Input

3
5 5 1
0 0 5 5 5 5 2
0 0 3 5
2 0 5 5 30 30 5
0 0 30 10
0 10 30 20
0 20 30 30
0 0 15 30
15 0 30 30

Sample Output

1
-1
2

精确覆盖问题:

1 0 0 1 0 0

0 1 0 1 0 1

0 1 1 0 0 0

0 0 0 0 1 0

在这样一个矩形中,找出最少的几行,使得这几行合起来,每一列都只有一个1,即这几行覆盖了每一列

解决精确覆盖问题的方法是Daning Links.网上有很多博客,

这道题目的意思是选择最少的矩形可以完全覆盖整个地图,不重复,

和精确覆盖如出一辙。可以转换一下,把n*m地图的每一个格子看成一个列

把小矩形看成一个行,小矩形里面的格子都是这个行里面包含的列。那么转换成精确覆盖的问题

然后套用模板。另外记得这道题目行是m,列是n.每个小矩形的格子

#include <iostream>
#include <string.h>
#include <stdlib.h>
#include <algorithm>
#include <math.h>
#include <stdio.h> using namespace std;
typedef long long int LL;
const int maxn=5e5; struct DACL
{
int H[maxn+5],S[maxn+5];
int u[maxn+5],d[maxn+5],l[maxn+5],r[maxn+5];
int Row[maxn+5],Col[maxn+5];
int n,m;
int size;
int ans;
void init(int x,int y)
{
n=x;
m=y;
for(int i=0;i<=m;i++)
{
u[i]=i;
d[i]=i;
l[i]=i-1;
r[i]=i+1;
S[i]=0;
}
l[0]=m;
r[m]=0;
size=m;
ans=-1;
for(int i=1;i<=n;i++)
H[i]=-1;
} void link(int row,int col)
{
Row[++size]=row;
Col[size]=col;
d[size]=d[col];
u[d[col]]=size;
u[size]=col;
d[col]=size;
if(H[row]==-1) H[row]=l[size]=r[size]=size;
else
{
l[size]=l[H[row]];
r[l[H[row]]]=size;
r[size]=H[row];
l[H[row]]=size;
}
S[col]++;
} void remove(int col)
{
l[r[col]]=l[col];
r[l[col]]=r[col];
for(int i=d[col];i!=col;i=d[i])
{
//cout<<i<<endl;
for(int j=r[i];j!=i;j=r[j])
{
// cout<<j<<endl;
u[d[j]]=u[j];
d[u[j]]=d[j];
S[Col[j]]--;
}
}
} void resurm(int col)
{
for(int i=u[col];i!=col;i=u[i])
{
//cout<<i<<endl;
for(int j=r[i];j!=i;j=r[j])
{
//cout<<j<<endl;
d[u[j]]=j;
u[d[j]]=j;
S[Col[j]]++;
}
}
l[r[col]]=col;
r[l[col]]=col;
} void dance(int dd)
{
if(ans!=-1&&dd>=ans) return;
if(r[0]==0)
{
if(ans==-1)
ans=dd;
else if(ans>dd)
ans=dd;
return;
}
int col=r[0];
for(int i=r[0];i!=0;i=r[i])
{
if(S[col]>S[i])
col=i;
}
remove(col);
for(int i=d[col];i!=col;i=d[i])
{
for(int j=r[i];j!=i;j=r[j])
{
//cout<<j<<endl;
remove(Col[j]); }
dance(dd+1);
for(int j=l[i];j!=i;j=l[j])
resurm(Col[j]); }
resurm(col); }
}temp;
int main()
{
int t;
scanf("%d",&t);
int p;
int x1,x2,y1,y2;
int n,m;
while(t--)
{
scanf("%d%d%d",&n,&m,&p);
temp.init(p,n*m);
for(int k=1;k<=p;k++)
{
scanf("%d%d%d%d",&x1,&y1,&x2,&y2);
for(int i=x1+1;i<=x2;i++)
{
for(int j=y1+1;j<=y2;j++)
{
temp.link(k,j+i*(m-1));
}
}
}
temp.dance(0);
printf("%d\n",temp.ans);
}
return 0;
}

ZOJ 3209 Treasure Map(精确覆盖)的更多相关文章

  1. ZOJ 3209 Treasure Map 精确覆盖

    题目链接 精确覆盖的模板题, 把每一个格子当成一列就可以. S忘记初始化TLE N次, 哭晕在厕所...... #include<bits/stdc++.h> using namespac ...

  2. (简单) ZOJ 3209 Treasure Map , DLX+精确覆盖。

    Description Your boss once had got many copies of a treasure map. Unfortunately, all the copies are ...

  3. zoj 3209.Treasure Map(DLX精确覆盖)

    直接精确覆盖 开始逐行添加超时了,换成了单点添加 #include <iostream> #include <cstring> #include <cstdio> ...

  4. zoj - 3209 - Treasure Map(精确覆盖DLX)

    题意:一个 n x m 的矩形(1 <= n, m <= 30),现给出这个矩形中 p 个(1 <= p <= 500)子矩形的左下角与右下角坐标,问最少用多少个子矩形能够恰好 ...

  5. ZOJ 3209 Treasure Map (Dancing Links 精确覆盖 )

    题意 :  给你一个大小为 n * m 的矩形 , 坐标是( 0 , 0 ) ~ ( n , m )  .然后给你 p 个小矩形 . 坐标是( x1 , y1 ) ~ ( x2 , y2 ) , 你选 ...

  6. ZOJ 3209 Treasure Map (Dancing Links)

    Treasure Map Time Limit: 2 Seconds      Memory Limit: 32768 KB Your boss once had got many copies of ...

  7. ZOJ 3209 Treasure Map (Dancing Links)

    Treasure Map Time Limit:2000MS     Memory Limit:32768KB     64bit IO Format:%lld & %llu Submit S ...

  8. ZOJ 3209 Treasure Map DLX

    用最少的矩阵覆盖n*m的地图.注意矩阵不能互相覆盖. 这里显然是一个精确覆盖,但因为矩阵拼接过程中,有公共的边,这里须要的技巧就是把矩阵的左边和以下截去一个单位. #include <stdio ...

  9. ZOJ3209 Treasure Map —— Danc Links 精确覆盖

    题目链接:https://vjudge.net/problem/ZOJ-3209 Treasure Map Time Limit: 2 Seconds      Memory Limit: 32768 ...

随机推荐

  1. 用wamp5和ZendOptimizer搭建环境运行Discuz论坛

    用wamp5和ZendOptimizer搭建环境运行Discuz论坛 用wamp5和ZendOptimizer搭建环境运行Discuz论坛 一: 环境:      1:Windows操作系统(Linu ...

  2. taskAffinity属性

    Activity的归属,也就是Activity应该在哪个Task中,Activity与Task的吸附关系.我们知道,一般情况下在同一个应用中,启动的Activity都在同一个Task中,它们在该Tas ...

  3. PyQT中多重继承,其中继承的父类有QObject或QObject的子孙类

    如果Child多重继承(Parent_1,Parent_2,Parent_3),其super函数 super(Child, self).__init__() 则会执行继承的最左侧的父类:Parent_ ...

  4. 转载:15个最受欢迎的Python开源框架

    出自:http://python.jobbole.com/72306/?replytocom=57112 15个最受欢迎的Python开源框架 Django: Python Web应用开发框架 Dja ...

  5. 【Java面试题】53 能不能自己写个类,也叫java.lang.String?

    可以,但是即使你写了这个类,也没有用. 这个问题涉及到加载器的委托机制,在类加载器的结构图(在下面)中,BootStrap是顶层父类,ExtClassLoader是BootStrap类的子类,ExtC ...

  6. url传参错误的痛

    今天用一下方法给后台传参数: var url = 'patrolpoint!totalHistoryPage.action' +        '?patrolPoint.batchOnTime=' ...

  7. mysql数据库不能远程访问的问题

    1.先暂停防火墙,检查是不是防火墙的问题. 2. 如若不是防火墙的问题,则可能是用户权限的问题. 这里创建一个用户来用于远程连接:首先登陆你的mysql数据库 命令: mysql -uroot -p ...

  8. 安装JDK出现问题 Error opening registry key'software\Javasoft\Java Runtime Environment'

    第一次安装JDK测试是否安装成功,打开cmd输入java -version 回车的时候出现如下错误: Error opening registry key'software\Javasoft\Java ...

  9. NHibernate之映射文件配置说

    1. hibernate-mapping 这个元素包括以下可选的属性.schema属性,指明了这个映射所引用的表所在的schema名称.假若指定了这个属性, 表名会加上所指定的schema的名字扩展为 ...

  10. Java精选笔记_国际化

    国际化 什么是国际化 指软件在开发时就应该具备支持多种语言和地区的功能,当应对不同国家和地区的用户访问,针对不同国家和地区的用户,提供相应的.符合来访者阅读习惯的页面和数据. 由于国际化interna ...