ZOJ 3209 Treasure Map(精确覆盖)
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 <= n, m <= 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(精确覆盖)的更多相关文章
- ZOJ 3209 Treasure Map 精确覆盖
题目链接 精确覆盖的模板题, 把每一个格子当成一列就可以. S忘记初始化TLE N次, 哭晕在厕所...... #include<bits/stdc++.h> using namespac ...
- (简单) ZOJ 3209 Treasure Map , DLX+精确覆盖。
Description Your boss once had got many copies of a treasure map. Unfortunately, all the copies are ...
- zoj 3209.Treasure Map(DLX精确覆盖)
直接精确覆盖 开始逐行添加超时了,换成了单点添加 #include <iostream> #include <cstring> #include <cstdio> ...
- zoj - 3209 - Treasure Map(精确覆盖DLX)
题意:一个 n x m 的矩形(1 <= n, m <= 30),现给出这个矩形中 p 个(1 <= p <= 500)子矩形的左下角与右下角坐标,问最少用多少个子矩形能够恰好 ...
- ZOJ 3209 Treasure Map (Dancing Links 精确覆盖 )
题意 : 给你一个大小为 n * m 的矩形 , 坐标是( 0 , 0 ) ~ ( n , m ) .然后给你 p 个小矩形 . 坐标是( x1 , y1 ) ~ ( x2 , y2 ) , 你选 ...
- ZOJ 3209 Treasure Map (Dancing Links)
Treasure Map Time Limit: 2 Seconds Memory Limit: 32768 KB Your boss once had got many copies of ...
- ZOJ 3209 Treasure Map (Dancing Links)
Treasure Map Time Limit:2000MS Memory Limit:32768KB 64bit IO Format:%lld & %llu Submit S ...
- ZOJ 3209 Treasure Map DLX
用最少的矩阵覆盖n*m的地图.注意矩阵不能互相覆盖. 这里显然是一个精确覆盖,但因为矩阵拼接过程中,有公共的边,这里须要的技巧就是把矩阵的左边和以下截去一个单位. #include <stdio ...
- ZOJ3209 Treasure Map —— Danc Links 精确覆盖
题目链接:https://vjudge.net/problem/ZOJ-3209 Treasure Map Time Limit: 2 Seconds Memory Limit: 32768 ...
随机推荐
- HttpComponents 基础接口/类与HTTP message的对应关系
前提一: 什么是HTTP Message -- 遵循HTTP协议发送的消息!其格式是固定的:HTTP Message = Message Line + Message Header + Message ...
- 网络协议之ftp---ftp 协议详解
http://blog.csdn.net/yxyhack/article/details/1826256 http://blog.chinaunix.net/uid-7777486-id-204393 ...
- Android检测Cursor泄漏的原理以及使用方法(转)
简介: 本文介绍如何在 Android 检测 Cursor 泄漏的原理以及使用方法,还指出几种常见的出错示例.有一些泄漏在代码中难以察觉,但程序长时间运行后必然会出现异常.同时该方法同样适合于其他需要 ...
- CentOS7忘记root密码的解决方法
开机启动centos 7.0,看到如下画面,选择下图选单,按"e"键 在下图linux16行中,将ro这两个字母修改为rw init=/sysroot/bin/sh 修改结果如下图 ...
- iOS 自动编译脚本
#!/bin/sh #项目路径 PROJECT_DIR="/Users/mac/Desktop/_housemart" #临时项目 PROJECT_TEMP_DIR="/ ...
- fstrict-aliasing
承如“optimization blocks”文中所述,由于相同的指针可能指向相关的内存区,因此编译器将不做过分的优化…… 特意搜了下编译器在不同的优化等级下都有哪些默认优化,因此有了此记录(比较长, ...
- develop brew app from here
https://brewx.qualcomm.com/brew/sdk/download.jsp?page=dx/en/brew31/ad/tl/overview the email is silen ...
- Java 实现选择排序
选择排序: 原理:依次从数组最左边取一个元素,与之后的位置上的元素比較,假设大于/小于(取决于须要升序排还是降序排).则保存较大/较小元素的索引 当一轮比較后,将保存的较大/较小元素的索引与 这轮開始 ...
- day23<File类递归练习>
File类递归练习(统计该文件夹大小) File类递归练习(删除该文件夹) File类递归练习(拷贝) File类递归练习(按层级打印) 递归练习(斐波那契数列) 递归练习(1000的阶乘所有零和尾部 ...
- LinkedBlockingQueue(lbq)阻塞队列
最近开发中,经常使用这个类LinkedBlockingQueue,它是BlockingQueue这个子类. 并发库中的BlockingQueue是一个比较好玩的类,顾名思义,就是阻塞队列.该类主要提供 ...