肯定是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 ;
}

最新文章

  1. 相同根域名下跨域共享session的解决方案
  2. DOS 下 mysql 导入.SQL
  3. extjs MVC模式的个人看法
  4. 电脑升级完Xcode8后 注释快捷键无效的问题
  5. C++堆和栈的比较(7个区别)
  6. Spring+MVC+Mybatis整合
  7. 任务调度框架Quartz原理简介
  8. 定位篇align_measurements
  9. hdu1272 小希的迷宫(并查集)
  10. Codeforces.487C.Prefix Product Sequence(构造)
  11. phpstudy+dvwa配置
  12. CentOS和Redhat救援模式
  13. H5新特性实现对class的增删改
  14. 制作根文件系统之Busybox init进程的启动过程分析
  15. mybatis注解方式批量插入数据
  16. Android 开发环境配置图文教程(jdk+eclipse+android sdk)
  17. PHP图片压缩
  18. 关于limit_req和limit_conn的区别
  19. eclipse中tomcat能正常启动,在浏览器中不能打开问题
  20. SaltStack的配置管理--jinja (七)

热门文章

  1. (六)SpringIoc之延时加载
  2. 关于flex布局对自己的影响
  3. 当前主要的常用的PHP环境部署套件比较
  4. 飞思卡尔开发板-迅为IMX6开兼容单核 双核 四核Plus开发板
  5. viewport 640宽的做法 针对iphone和安卓单独设置
  6. Python轮换
  7. HTML location 用法(获取当前URL)
  8. rownum导致sql不能进行谓词推入
  9. 零基础入门学习Python(19)--函数:我的地盘听我的
  10. 【Html,Css,JavaScript】初学总结