此题反正我自己是认为poj给的数据范围是有错的,不知道是不是自己太弱了,有大神在的话,欢迎来呸!

其实目的就在于建图,搞的我后来建了一个无比纠结的图,先建立了火柴棍和正方形的一个全图,然后再删除一些火柴和正方形

其实舞蹈链就是一个剪枝的深搜,好好理解就是的。数据n应该大于5的。

 #include<iostream>
#include<cstring>
#include<cstdlib>
#include<cstdio>
int const N = ;
int n;
int des,dnum;
int mark[N][N],map[N][N];
int rvis[N],cvis[N]; int L[N],R[N],U[N],D[N];
int S[N];
int nCol[N];
int nRow[N];
bool answer[N+];
int best;
bool hash[N]; void init(int row,int col)
{
int r=row;
int w=col;
for (int i=;i<=w;i++)
{
L[i]=i-; R[i]=i+;
U[i]=D[i]=i;
}
L[]=w;
R[w]=;
int cnt=w+;
for (int i=;i<r;i++)
{
int head=cnt,tail=cnt;
for (int j=;j<w;j++)
{
int c = j+;
if(map[i][j]==)
{
S[c]++;
nCol[cnt]=c;
nRow[cnt]=i;
U[D[c]]=cnt;
D[cnt]=D[c];
U[cnt]=c;
D[c]=cnt;
L[cnt]=tail; R[tail]=cnt;
R[cnt]=head; L[head]=cnt;
tail=cnt;
cnt++;
}
}
}
}
void Remove(int x)
{
for (int i=D[x];i!=x;i=D[i])
{
L[R[i]]=L[i];
R[L[i]]=R[i];
S[nCol[i]]--;
}
}
void Resume(int x)
{
for (int i=D[x];i!=x;i=D[i])
{
L[R[i]]=R[L[i]]=i;
S[nCol[i]]++;
}
}
int Hash()
{
int ans=;
memset(hash,false,sizeof(hash));
for (int c=R[];c!=;c=R[c])
{
if (!hash[c])
{
hash[c]=;
ans++;
for (int i=D[c];i!=c;i=D[i])
for (int j=R[i];j!=i;j=R[j])
hash[nCol[j]]=;
}
}
return ans;
}
void dfs(int ans)
{
if (R[]==)
{
if(ans<best)
best=ans;
return;
}
int best2 = ans + Hash();
if (best2 >= best)
return; int c,minnum=;
for (int i=R[];i!=;i=R[i])
{
if (S[i]==) return;
if (S[i]<minnum)
{
minnum=S[i];
c=i;
}
}
for (int i=U[c];i!=c;i=U[i])
{
answer[nRow[i]]=true;
Remove(i);
for (int j=R[i];j!=i;j=R[j])
{Remove(j);}
dfs(ans+);
for (int j=L[i];j!=i;j=L[j])
{Resume(j);}
Resume(i);
answer[nRow[i]]=false;
}
}
int main()
{
int T;
scanf("%d",&T);
while(T--)
{
scanf("%d",&n);
memset(mark,,sizeof(mark));
int i,j,k,si,num=,ct=;
for(si=; si<=n; si++)
{
for(i=; i<=n-si+; i++)
{
for(j=; j<=n-si+; j++)
{
for(k=; k<si; k++)
{
mark[(i-)*(*n+)+j+k-][ct]=;
mark[(i-+si)*(*n+)+j+k-][ct]=;
mark[i*n+(i-)*(n+)+j+k*(*n+)-][ct]=;
mark[i*n+(i-)*(n+)+j+k*(*n+)+si-][ct]=;
}
ct++;
}
}
}
scanf("%d",&dnum);
memset(rvis,,sizeof(rvis));
memset(cvis,,sizeof(cvis));
memset(map,,sizeof(map));
for(i=;i<dnum;i++)
{
scanf("%d",&des);
rvis[des-]=;
for(j=;j<ct;j++)
{
if(mark[des-][j]==)
{
if(!cvis[j])
cvis[j]=;
}
}
}
int row=,col=,maxr=*n*n+*n;
for(i=;i<maxr;i++)
{
if(rvis[i])continue;
col=;
int f=;
for(j=;j<ct;j++)
{
if(cvis[j])continue;
if(mark[i][j])f=;
map[row][col++]=mark[i][j];
}
row++;
if(f)row--;
}
init(row,col);
best=;
dfs();
printf("%d\n",best);
}
return ;
}

poj 1084 舞蹈链(纠结题)的更多相关文章

  1. P4929 【模板】舞蹈链(DLX)

    题目背景 本题是舞蹈链模板——精确覆盖问题 题目描述 给定一个N行M列的矩阵,矩阵中每个元素要么是1,要么是0 你需要在矩阵中挑选出若干行,使得对于矩阵的每一列j,在你挑选的这些行中,有且仅有一行的第 ...

  2. 跳跃的舞者,舞蹈链(Dancing Links)算法——求解精确覆盖问题

    精确覆盖问题的定义:给定一个由0-1组成的矩阵,是否能找到一个行的集合,使得集合中每一列都恰好包含一个1 例如:如下的矩阵 就包含了这样一个集合(第1.4.5行) 如何利用给定的矩阵求出相应的行的集合 ...

  3. DLX舞蹈链 hdu5046

    题意: 在N个城市选出K个城市,建飞机场(1 ≤ N ≤ 60,1 ≤ K ≤ N),N个城市给出坐标,选择这K个机场,使得从城市到距离自己最近的机场的 最大的距离 最小. 输出这个最小值. 思路: ...

  4. [转] 舞蹈链(Dancing Links)——求解精确覆盖问题

    转载自:http://www.cnblogs.com/grenet/p/3145800.html 精确覆盖问题的定义:给定一个由0-1组成的矩阵,是否能找到一个行的集合,使得集合中每一列都恰好包含一个 ...

  5. 舞蹈链 DLX

    欢迎访问——该文出处-博客园-zhouzhendong 去博客园看该文章--传送门 舞蹈链是一个非常玄学的东西…… 问题模型 精确覆盖问题:在一个01矩阵中,是否可以选出一些行的集合,使得在这些行的集 ...

  6. 舞蹈链(DLX)

    舞蹈链(DLX) Tags:搜索 作业部落 评论地址 一.概述 特别特别感谢这位童鞋His blog 舞蹈链是一种优美的搜索,就像下面这样跳舞- 舞蹈链用于解决精确覆盖或者重复覆盖的问题 你可以想象成 ...

  7. Dancing Links算法(舞蹈链)

    原文链接:跳跃的舞者,舞蹈链(Dancing Links)算法——求解精确覆盖问题 作者:万仓一黍 出处:http://grenet.cnblogs.com/ 本文版权归作者和博客园共有,欢迎转载,但 ...

  8. 转载 - 跳跃的舞者,舞蹈链(Dancing Links)算法——求解精确覆盖问题

    出处:http://www.cnblogs.com/grenet/p/3145800.html 精确覆盖问题的定义:给定一个由0-1组成的矩阵,是否能找到一个行的集合,使得集合中每一列都恰好包含一个1 ...

  9. [poj3074]Sudoku(舞蹈链)

    题目链接:http://poj.org/problem?id=3074 舞蹈链精确覆盖的经典题目,一个数独每个位置的要求,可以得到以下四个约束1.每个位置有且只有一个数字2.每个位置的数字在一行只能出 ...

随机推荐

  1. 几个app maker的网站

    简网APP工场:http://www.cutt.com/app 爱传iappk:http://www.iappk.com 安米网:http://www.appbyme.com/mobcentACA/i ...

  2. OpenJudge 2680 化验诊断 C++

    链接地址:http://bailian.openjudge.cn/practice/2680 题目: 总时间限制: 1000ms 内存限制: 65536kB 描述 下表是进行血常规检验的正常值参考范围 ...

  3. git 使用小结

    git git是一个分布式版本控制系统,主要用于多人协作.可以将自己的代码托管到github上. 常用的几个命令 git pull 拉取别人的修改到本地,如果拉取内容和本地所作的修改存在冲突,git会 ...

  4. hdu 5025 Saving Tang Monk 状态压缩dp+广搜

    作者:jostree 转载请注明出处 http://www.cnblogs.com/jostree/p/4092939.html 题目链接:hdu 5025 Saving Tang Monk 状态压缩 ...

  5. 树莓派实现TimeMachine以及samba服务

    最近一段时间感觉用移动硬盘备份Mac电脑很不方便,因为要把移动硬盘拿出来,还要插上电脑备份,看了一下AirPort,但是价钱太贵,况且只能用于Mac备份并不能用于其他的Samba服务等,感觉不太划算, ...

  6. windows的路由例子

    一.不同网卡不同网关 wlan:192.168.100.1/24 wifi:192.168.8.1/24 1.如果想要特定的ip访问wifi网络 可以用 route add 1.2.3.4 mask ...

  7. Android开发系列之Android项目的目录结构

    今天开始正式学习Android开发的种种细节,首先从最基本的概念和操作学起. 首先看一下Android项目的目录结构. 这是我随便建立的一个test项目,我们重点关注一下几个方面的内容: 1.src目 ...

  8. DOM五大对象

    1.Window 对象:Window 对象表示浏览器中打开的窗口. 如果文档包含框架(frame 或 iframe 标签),浏览器会为 HTML 文档创建一个 window 对象,并为每个框架创建一个 ...

  9. C语言到底怎么了?

    自2015年11月开始,所有C语言系列都呈现出衰落之势.在超过15年的时间里,C语言在编程语言排行榜中的占比一直有15%-20%,但今年却突然急转直下,目前占比已不足10%,且目前看来回天乏力. 那么 ...

  10. Java学习--final与static

    final是java的关键字,它所表示的是“这部分是无法修改的”. 编译期常量,它在类加载的过程就已经完成了初始化,所以当类加载完成后是不可更改的,编译期可以将它代入到任何用到它的计算式中,也就是说可 ...