zoj2479 Cover the Rectangular Ground
肯定是dfs搜一下的,但是呢存在一个很大的剪枝,也就是面积必定要是相等的,那么如何去操作呢,可以想到的是二进制枚举选取的方法,然后把方法中选取的矩形面积求和并判断一下即可,然后dfs搜索,要注意的是,需要维持现状的变量在变化之前一定要记录,要变回来时,一定要变回来,另外在dfs中还可以判断覆盖是否合理,以及是否已经没有可找到的空白区域。
#include<cstdio>
#include<cstdlib>
#include<iostream>
#include<string>
#include<set>
#include<algorithm>
#include<vector>
#include<queue>
#include<list>
#include<cmath>
#include<cstring>
#include<map>
#include<stack>
using namespace std;
#define INF 0x3f3f3f3f
#define maxn 2005
#define ull unsigned long long
#define ll long long
#define hashmod 99999839
#define mod 9997
int T,n,m,q,x[],y[],p[],sx,sy,b;
int a[][];
bool f[],ans;
bool overlap(int i,int v,int t){
int ex = x[i],ey = y[i];
if(v) swap(ex,ey);
if(sx + ex - >= n || sy + ey - >= m) return false;
for(int j = sx;j < sx + ex;++j){
for(int k = sy;k < sy + ey;++k){
if(t && a[j][k]) return false;
}
}
for(int j = sx;j < sx + ex;++j){
for(int k = sy;k < sy + ey;++k){
a[j][k] = t;
}
}
return true;
}
bool findempty(){
for(int i = sx;i < n;++i){
for(int j = ;j < m;++j){
if(!a[i][j]){
sx = i,sy = j;
return true;
}
}
}
return false;
}
bool check(){
for(int i = ;i < n;++i){
for(int j = ;j < m;++j){
if(!a[i][j]) return false;
}
}
return true;
}
void dfs(){
bool flag = false;
for(int i = ;i < q;++i){
if((b & p[i]) && !f[i]){
flag = true;
f[i] = true;
int tx = sx,ty = sy;
if(overlap(i,,)){
if(findempty()) dfs();
else{
ans = true;
return;
}
if(ans) return;
sx = tx,sy = ty;
overlap(i,,);
}
if(!overlap(i,,)){
f[i] = false;
continue;
}
if(findempty()) dfs();
else{
ans = true;
return;
}
if(ans) return;
sx = tx,sy = ty;
overlap(i,,);
f[i] = false;
}
}
if(!flag && check()) ans = true;
}
bool solve(){
for(int i = ;i < p[q];++i){//枚举选取哪一些
int s = ;
for(int j = ;j < q;++j){
if(i & p[j]) s = s + x[j] * y[j];
}
if(s != n * m) continue;
b = i;
ans = false;
sx = sy = ;
dfs();
if(ans) return true;
}
return false;
}
int main(){
/*submit failed*/
/*submit failed*/
/*submit failed*//*submit failed*//*submit failed*/
freopen("a.in","r",stdin);
freopen("b.out","w",stdout);
cin >> T;
p[] = ;
for(int i = ;i <= ;++i) p[i] = p[i - ] << ;
while(T--){
scanf("%d%d",&n,&m);
cin >> q;
for(int i = ;i < q;++i){
scanf("%d%d",&x[i],&y[i]);
}
memset(a,,sizeof(a));
memset(f,false,sizeof(f));
if(solve()) puts("YES");
else puts("NO");
}
return ;
}
zoj2479 Cover the Rectangular Ground的更多相关文章
- Entity Framework 6 Recipes 2nd Edition(11-12)译 -> 定义内置函数
11-12. 定义内置函数 问题 想要定义一个在eSQL 和LINQ 查询里使用的内置函数. 解决方案 我们要在数据库中使用IsNull 函数,但是EF没有为eSQL 或LINQ发布这个函数. 假设我 ...
- HBase 数据模型(Data Model)
HBase Data Model--HBase 数据模型(翻译) 在HBase中,数据是存储在有行有列的表格中.这是与关系型数据库重复的术语,并不是有用的类比.相反,HBase可以被认为是一个多维度的 ...
- 城市边界线预测(根据灯光指数)(PUL)
1.EXEALL.m function EXEALL(FilePath, FileName)%执行所有流程% FilePath: 文件夹所在路径% FileName: 文件夹名称 FullPath = ...
- poj 1266 Cover an Arc.
http://poj.org/problem?id=1266 Cover an Arc. Time Limit: 1000MS Memory Limit: 10000K Total Submiss ...
- UVALive 3959 Rectangular Polygons (排序贪心)
Rectangular Polygons 题目链接: http://acm.hust.edu.cn/vjudge/contest/129733#problem/G Description In thi ...
- poj 2836 Rectangular Covering
Rectangular Covering Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 2776 Accepted: 7 ...
- Dancing Links and Exact Cover
1. Exact Cover Problem DLX是用来解决精确覆盖问题行之有效的算法. 在讲解DLX之前,我们先了解一下什么是精确覆盖问题(Exact Cover Problem)? 1.1 Po ...
- img及父元素(容器)实现类似css3中的background-size:contain / background-size:cover
img及父元素(容器)实现类似css3中的background-size:contain / background-size:cover <!DOCTYPE html> <html ...
- 集合覆盖 顶点覆盖: set cover和vertex cover
这里将讲解一下npc问题中set cover和vertex cover分别是什么. set cover: 问题定义: 实例:现在有一个集合A,其中包含了m个元素(注意,集合是无序的,并且包含的元素也是 ...
随机推荐
- jquery readio checked
今天太鬼火了为这个难问题搜了一下午了到最后还是csdn的朋友给了我正确的答案http://bbs.csdn.net/topics/300162450谢谢这位朋友 // $("#ISOK1&q ...
- HttpServletRequest对象,自己学习的心得。
1. HttpServletRequest介绍 HttpServletRequest对象代表客户端的请求,当客户端通过Http超文本传输协议访问服务器时,Http请求头中的所有信息都封装在这个对象中, ...
- 前端--1、HTML基础
web服务 处于应用层的http协议负责的数据传输与解析.位于socket上层,用socket传输http数据时需要在消息开头处声明是http协议/相应http版本 状态码 状态码含义 \r\n\r\ ...
- vue2.0 v-model指令
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...
- 阿里云服务器基本搭建_错误1_Permission denied (publickey)
首先 修改这两个密码 然后重启服务器就可以了
- JavaSE-11 接口
学习要点 接口的定义 接口作为约定 接口作为能力 接口 为什么使用接口 需求描述 要求实现防盗门的功能(防盗门:带锁的门). 需求分析 门有“开”和“关”的功能,锁有“上锁”和“开锁”的功能. 将门和 ...
- javascript——js string 转 int 注意的问题——parseInt(转)
<script> var str='1250' ; alert( Number(str) ); //得到1250 alert(parseInt(str)); //得到12 ...
- 在vue中场景,循环行,点击当前行编辑数据
当前列表 点击编辑,行变为编辑框. <Row style="color:#999;margin-bottom:11px"> <Row style="ma ...
- java混淆工具Jocky和Proguard
java混淆工具有很多种,这里介绍Jocky和Proguard 一:Jocky是金蝶中间件技术领袖袁红岗先生的个人作品(旧有名称JOC).原本是方便Apusic 应用服务器的开发,现在开放出来,供大家 ...
- c语言中的 strcpy和strncpy字符串函数使用介绍
1.strcpy函数 函数原型:char *strcpy(char *dst,char const *src) 必须保证dst字符的空间足以保存src字符,否则多余的字符仍然被复 ...