WA了好久,第一次用重覆盖的模型做题。感觉这题有个陷阱,那就是当去掉某些边后,若因为这个边去掉而被破环的正方形还存在,那么就会造成覆盖不完全,WA.

所以,在去掉边后,必定有些正方形是不存在的,须重新计算。另外,计算一个正方形有哪些边也很困难。

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std; const int Maxn=100;
const int Maxr=100;
const int Maxnode=10000;
const int inf=(1<<30); bool vis[Maxn];
bool ls[Maxr][Maxn];
int L[Maxnode], R[Maxnode], D[Maxnode], U[Maxnode], C[Maxnode];
int S[Maxn], H[Maxr], size;
//²»ÐèÒªSÓò
void Link(int r, int c)
{
S[c]++; C[size]=c;
U[size]=U[c]; D[U[c]]=size;
D[size]=c; U[c]=size;
if(H[r]==-1) H[r]=L[size]=R[size]=size;
else {
L[size]=L[H[r]]; R[L[H[r]]]=size;
R[size]=H[r]; L[H[r]]=size;
}
size++;
}
void remove(int c){
for (int i=D[c]; i!=c; i=D[i])
L[R[i]]=L[i], R[L[i]]=R[i];
}
void resume(int c){
for (int i=U[c]; i!=c; i=U[i])
L[R[i]]=R[L[i]]=i;
}
int h(){ //Óþ«È·¸²¸ÇÈ¥¹ÀËã¼ôÖ¦
int ret=0;
bool vist[Maxn];
memset (vist, false, sizeof(vist));
for (int i=R[0]; i; i=R[i])
{
if(vist[i])continue;
ret++;
vist[i]=true;
for (int j=D[i]; j!=i; j=D[j])
for (int k=R[j]; k!=j; k=R[k])
vist[C[k]]=true;
}
return ret;
} int ans;
void Dance(int k){ //¸ù¾Ý¾ßÌåÎÊÌâÑ¡ÔñÏÞÖÆËÑË÷Éî¶È»òÖ±½ÓÇó½â¡£
if(k+h()>=ans) return;
if(!R[0]){
if(k<ans)ans=k;
return;
}
int c=R[0];
for (int i=R[0]; i; i=R[i])
if(S[i]<S[c])c=i;
for (int i=D[c]; i!=c; i=D[i]){
remove(i);
for (int j=R[i]; j!=i; j=R[j])
remove(j);
Dance(k+1);
for (int j=L[i]; j!=i; j=L[j])
resume(j);
resume(i);
}
return ;
} void initL(int x){ //col is 1~x,row start from 1
for (int i=0; i<=x; ++i){
S[i]=0;
D[i]=U[i]=i;
L[i+1]=i; R[i]=i+1;
} //¶ÔÁбíÍ·³õʼ»¯
R[x]=0;
size=x+1; //ÕæÕýµÄÔªËØ´Óm+1¿ªÊ¼
memset (H, -1, sizeof(H));
ans=inf;
//markÿ¸öλÖõÄÃû×Ö
} bool check(int i,int j,int si,int n){
for(int k=0;k<si;k++){
if(vis[(i-1)*(2*n+1)+j+k]) return false;
if(vis[(i-1+si)*(2*n+1)+j+k]) return false;
if(vis[i*n+(i-1)*(n+1)+j+k*(2*n+1)]) return false;
if(vis[i*n+(i-1)*(n+1)+j+k*(2*n+1)+si]) return false;
}
return true;
} int main(){
int kase,n; int sof,tmp,tt,c;
scanf("%d",&kase);
while(kase--){
// sof=0;
scanf("%d",&n);
// initL(sof);
scanf("%d",&tt);
memset(vis,false,sizeof(vis));
for(int i=1;i<=tt;i++){
scanf("%d",&tmp);
vis[tmp]=true;
}
memset(ls,false,sizeof(ls));
c=1;
for(int si=1;si<=n;si++){
for(int i=1;i<=n-si+1;i++){
for(int j=1;j<=n-si+1;j++){
if(check(i,j,si,n)){
for(int k=0;k<si;k++){
ls[(i-1)*(2*n+1)+j+k][c]=true;
ls[(i-1+si)*(2*n+1)+j+k][c]=true;
ls[i*n+(i-1)*(n+1)+j+k*(2*n+1)][c]=true;
ls[i*n+(i-1)*(n+1)+j+k*(2*n+1)+si][c]=true;
}
c++;
}
}
}
}
initL(c-1);
for(int i=1;i<=2*(n)*(n+1);i++){
for(int j=1;j<c;j++)
if(ls[i][j])
Link(i,j);
}
Dance(0);
printf("%d\n",ans);
}
return 0;
}

  

POJ 1084的更多相关文章

  1. 【POJ 1084】 Square Destroyer

    [题目链接] http://poj.org/problem?id=1084 [算法] 迭代加深 [代码] #include <algorithm> #include <bitset& ...

  2. poj 1084 舞蹈链(纠结题)

    此题反正我自己是认为poj给的数据范围是有错的,不知道是不是自己太弱了,有大神在的话,欢迎来呸! 其实目的就在于建图,搞的我后来建了一个无比纠结的图,先建立了火柴棍和正方形的一个全图,然后再删除一些火 ...

  3. poj 1084 Brainman(归并排序)

    题目链接:http://poj.org/problem?id=1804 思路分析:序列的逆序数即为交换次数,所以求出该序列的逆序数即可. 根据分治法思想,序列分为两个大小相等的两部分,分别求子序列的逆 ...

  4. (中等) POJ 1084 Square Destroyer , DLX+可重复覆盖。

    Description The left figure below shows a complete 3*3 grid made with 2*(3*4) (=24) matchsticks. The ...

  5. [DLX反复覆盖] poj 1084 Square Destroyer

    题意: n*n的矩形阵(n<=5),由2*n*(n+1)根火柴构成,那么当中会有非常多诸如边长为1,为2...为n的正方形,如今能够拿走一些火柴,那么就会有一些正方形被破坏掉. 求在已经拿走一些 ...

  6. KUANGBIN带你飞

    KUANGBIN带你飞 全专题整理 https://www.cnblogs.com/slzk/articles/7402292.html 专题一 简单搜索 POJ 1321 棋盘问题    //201 ...

  7. BFS广搜题目(转载)

    BFS广搜题目有时间一个个做下来 2009-12-29 15:09 1574人阅读 评论(1) 收藏 举报 图形graphc优化存储游戏 有时间要去做做这些题目,所以从他人空间copy过来了,谢谢那位 ...

  8. Dancing Links [Kuangbin带你飞] 模版及题解

    学习资料: http://www.cnblogs.com/grenet/p/3145800.html http://blog.csdn.net/mu399/article/details/762786 ...

  9. Dancing Link专题

    一些链接: http://www.cnblogs.com/-sunshine/p/3358922.html http://www.cnblogs.com/grenet/p/3145800.html 1 ...

随机推荐

  1. 【POJ 1964】 City Game

    [题目链接] http://poj.org/problem?id=1964 [算法] 记f[i]表示第i行最多向上延伸的行数 然后,对于每一行,我们用单调栈计算出这一行向上延伸的最大矩形面积,取最大值 ...

  2. EOJ 1641/UVa The SetStack Computer

    Background from Wikipedia: “Set theory is a branch of mathematics created principally by the German ...

  3. Coursera Algorithms week1 算法分析 练习测验: 3Sum in quadratic time

    题目要求: Design an algorithm for the 3-SUM problem that takes time proportional to n2 in the worst case ...

  4. javaweb中的三个域

    1.Request域 程序产生数据,显示完了就没用了,就用这个域. 2.Session域 程序产生数据,出了显示用,待会还要用,就用这个域. 3.ServletContext域 程序产生数据,数据显示 ...

  5. thinkphp的session用法

    Session方法用于Session 设置.获取.删除和管理操作. Session 用于Session 设置.获取.删除和管理操作 用法 session($name, $value='') 参数 na ...

  6. CDH版Phoenix的安装(图文详解)

    不多说,直接上干货! 写在前面的话 我这里,四个节点的bigdata集群.分别为cmbigdata1.cmbigdata2.cmbigdata3和cmbigdata4. https://i.cnblo ...

  7. RabbitMQ 官方NET教程(一)【介绍】

    本教程假定RabbitMQ已在标准端口(5672)上的localhost上安装并运行.如果使用不同的主机,端口或凭据,连接设置将需要调整. RabbitMQ是一个消息代理:它接受并转发消息. 您可以将 ...

  8. Java 精度控制

    四舍五入,保留两位小数 (找了很多种方法,都有问题,测试得出下面这种方式是可用的) String str="0.235"; String.format("%.2f&quo ...

  9. OI知识点

  10. SLAM: 关于Orb_SLAM的使用小综述

    0.ORB_SLAM的官方网站:http://webdiis.unizar.es/~raulmur/orbslam/ 1. 参考知乎上对 orb-slam 的评价:orb-slam在众多SLAM方法中 ...