此题反正我自己是认为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. win/linux 下使用 psutil 获取进程 CPU / memory / IO 占用信息

    psutil - A cross-platform process and system utilities module for Python 1. 安装 pip 安装即可. windows 下需要 ...

  2. 【nodemailer】 初试

    nodemailer 是什么? 简单的讲nodemailer就是用来发送邮件的.最近的一个项目需要向客户的注册邮箱发送验证连接,研究了一下. 刚开始我以为nodemailer还可以用来接收邮件,看了好 ...

  3. php用户验证代码的简单例子

    发布:sunday01   来源:net     [大 中 小] 分享一个简单的php用户验证代码,适合初学的朋友参考,主要学习$_post传递数据及isset检测变量的方法. php简单用户验证代码 ...

  4. ecshop用户中心订单详情增加快递单物流信息查询显示的功能

    1,themes\default\user_transaction.dwt 找到: <!--{if $action eq order_detail} --> 在下面一行加入: <st ...

  5. C++ union 公共体

    union myun { struct { int x; int y; int z; }u; int k; }a; int main() { a.u.x =; a.u.y =; a.u.z =; a. ...

  6. shell脚本中>/dev/null的含义

    shell脚本中>/dev/null的含义 shell脚本中有段使用sqlplus的部分: sqlplus ${user_id} <<! >/dev/null spool sp ...

  7. Centos 6.4上面用Shell脚本一键安装vsftpd

    Centos 6.4上面用Shell脚本一键安装vsftpd install.sh #!/bin/bash if [ `uname -m` == "x86_64" ];then m ...

  8. Cygwin环境编译/usr/include/sys/_types.h:72:20: 致命错误:stddef.h:can not found

    环境介绍: win7_x64 +Cygwin64 gcc :4.8.2 g++:4.8.1 编译 c++的helloworld.cpp 一直失败! 代码如下: #include <iostrea ...

  9. grab jpegs from v4l2 devices

    某些平台下opencv不能直接直接支持摄像头获取图片或视频,这是需要使用v4l2(video for linux 2) 测试v4l2是否可以读到摄像头的内容,最简单的办法就是读取一张截图. v4l2g ...

  10. SPRING IN ACTION 第4版笔记-第五章BUILDING SPRING WEB APPLICATIONS-002-Controller的requestMapping、model

    一.RequestMapping 1.可以写在方法上或类上,且值可以是数组 package spittr.web; import static org.springframework.web.bind ...