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个元素(注意,集合是无序的,并且包含的元素也是 ...
随机推荐
- Program received signal SIGILL, Illegal instruction
Program received signal SIGILL, Illegal instruction 这个错误,发现是直接在printf 的%s中直接使用string类型,而没有使用c字符串格式造成 ...
- 用css制作圆环图表 (vue,sass)
效果图: 思路 :在一个容器里再放两个矩形,每个矩形都占一半,给这两个矩形都设置溢出隐藏,当去旋转矩形里面的圆形的时候,溢出部分就被隐藏掉了,这样就可以达到想要的效果. 代码-html: <di ...
- iOS programming Code Snippet Library
iOS programming Code Snippet Library The freebie code comes from the code snippet library. 代码来自cod ...
- java 解析四则混合运算表达式并计算结果
package ch8; import java.util.LinkedList; import java.util.List; import java.util.Stack; /** * 四则混合运 ...
- -webkit/IE/Firefox的一些样式
仅限于-webkit的样式特效:-webkit-overflow-scrolling:touch;滚动时回弹效果:如果出现偶尔卡住不动的情况,那么在使用该属性的元素上不设置定位或者手动设置定位为sta ...
- Java泛型中的协变和逆变
Java泛型中的协变和逆变 一般我们看Java泛型好像是不支持协变或逆变的,比如前面提到的List<Object>和List<String>之间是不可变的.但当我们在Java泛 ...
- 软件开发:速度 vs 质量
程序开发项目进行过程中,通常会冒出这样的困惑:应该选择速度,还是选择质量?很多程序猿都会有偷懒的思维,觉得把一些摸不清头绪.不知道怎么写的代码片段去掉,可以节省很多时间,更早完成项目计划. 其实过去几 ...
- ROS在rviz中实时显示轨迹(nav_msgs/Path消息的使用)
消息结构说明nav_msgs/Path.msg结构#An array of poses that represents a Path for a robot to followHeader heade ...
- STL中unique的使用
作用 unique函数可以删除有序数组中的重复元素,即去重(并不是真正的删除,后面会讲) 定义在头文件<algorithm>中 函数原型 1.只有两个参数,且参数类型都是迭代器: iter ...
- css 动态导入css文件 @import 动态js加载 都是静态的
@import "http://apps.bdimg.com/libs/bootstrap/3.3.4/css/bootstrap.css" /*-防止各大cdn公共库加载地址失效 ...