Dancing links的题目。

具体的dancing links的介绍 看:http://blog.csdn.net/sunny606/article/details/7833551

思想还是好理解的,主要看那个十字链表构成的图,看着看着就能理解。

对于dancing links 得发表一些看法:

1.十字链表 的数组模拟实在太优雅了,美的不行 R[L[x]] = R[x], L[R[x]] = L[x],恢复也优雅。

2.对于搜索这个剪肢 剪得简直是 干干净净,让我感觉对于平时的一些搜索我都可以用双向链表来模拟了

3.实际上这是一个 十字循环链表。

zoj 3209的话,就是一个精确覆盖的问题。把这个图形变成一块一块,然后摊平,5*5的矩阵就能形成25个格子。

然后把题目给的一个一个图形作为行包括的那个小块为1其他为0,就变成了文章中的例题。只要使结果为全1即可,调用dancing links优雅解题。

# include<stdio.h>
# include<string.h>
# define CL 905
# define ROW 505
# define V 452000
int R[V],L[V];
int U[V],D[V];
int C[V];
int H[ROW],S[CL];
int ak,n,m,size,p;
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)
{int i,j;L[R[c]]=L[c];R[L[c]]=R[c];for(i=D[c];i!=c;i=D[i]){for(j=R[i];j!=i;j=R[j]){S[C[j]]--;U[D[j]]=U[j];D[U[j]]=D[j];}}
}
void resume(int c)
{int i,j;for(i=U[c];i!=c;i=U[i]){for(j=L[i];j!=i;j=L[j]){S[C[j]]++;U[D[j]]=D[U[j]]=j;}}L[R[c]]=c;R[L[c]]=c;
}
void Dance(int k)
{int i,j,Min,c;if(!R[0]){if(k<ak) ak=k;return;}for(Min=ROW,i=R[0];i;i=R[i])if(Min>S[i]) Min=S[i],c=i;remove(c);for(i=D[c];i!=c;i=D[i]){for(j=R[i];j!=i;j=R[j])remove(C[j]);Dance(k+1);for(j=L[i];j!=i;j=L[j])resume(C[j]);}resume(c);
}
int main()
{int i,j,ncase,x1,y1,x2,y2,k;scanf("%d",&ncase);while(ncase--){scanf("%d%d%d",&n,&m,&p);for(i=0;i<=m*n;i++){S[i]=0;U[i]=D[i]=i;L[i+1]=i;R[i]=i+1;}R[n*m]=0;size=n*m+1;memset(H,-1,sizeof(H));for(i=1;i<=p;i++){scanf("%d%d%d%d",&x1,&y1,&x2,&y2);for(j=y1;j<=y2-1;j++)for(k=x1;k<x2;k++)Link(i,j*n+k+1);}ak=ROW;Dance(0);printf("%d\n",ak==ROW?-1:ak);}return 0;
}

zoj 3209 Dancing links/hust 1017相关推荐

  1. Treasure Map ZOJ - 3209(Dancing Links)

    传送门 题解:首先可以先看下这篇对于Dancing Links的介绍,很好的传送门 然后这个题其实建模很简单的,把n*m的大矩阵转化成一排,然后把那些小矩阵对应起来,之后进行选取,如果可以选出最小集合 ...

  2. Kuangbin专题三Dancing Links

    Kuangbin专题三Dancing Links 没写完所有的,因为要去上课了赶紧先预习一下,这就先发出来吧. 跳舞链这东西以前在hihocoder上翻到过,当时看的模模糊糊的,现在好好学一学. 暂时 ...

  3. 浅入 dancing links x(舞蹈链算法)

    abastract:利用dancing links 解决精确覆盖问题,例如数独,n皇后问题:以及重复覆盖问题. 要学习dacning links 算法,首先要先了解该算法适用的问题,精确覆盖问题和重复 ...

  4. 【转载】浅入 dancing links x(舞蹈链算法)

    转载自原文出处 浅入 dancing links x(舞蹈链算法) abastract:利用dancing links 解决精确覆盖问题,例如数独,n皇后问题:以及重复覆盖问题. 要学习dacning ...

  5. dancing links(舞蹈链)——求解精准覆盖及重复覆盖问题

    以下转自:https://blog.csdn.net/the_star_is_at/article/details/53425736 问题描述: 给定一个n*m的矩阵,有些位置为1,有些位置为0.如果 ...

  6. 算法帖——用舞蹈链算法(Dancing Links)求解俄罗斯方块覆盖问题

    问题的提出:如下图,用13块俄罗斯方块覆盖8*8的正方形.如何用计算机求解? 解决这类问题的方法不一而足,然而核心思想都是穷举法,不同的方法仅仅是对穷举法进行了优化 用13块不同形状的俄罗斯方块(每个 ...

  7. Dancing Links

    Dancing Links用来解决如下精确匹配的问题: 选择若干行使得每一列恰好有一个1.Dancing Links通过对非零元素建立双向十字循环链表.上面的例子建立的链表如下所示: 计算的时候使用搜 ...

  8. DLX (Dancing Links/舞蹈链)算法——求解精确覆盖问题

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

  9. [学习笔记]舞蹈链(Dancing Links)C++实现(指针版)

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

最新文章

  1. 常见一致性协议(一)
  2. 华为服务器系统关机命令,云服务器关机指令
  3. 【小白学习C++ 教程】三、C++用户输入、判断语句和switch
  4. mysql中 !40000 DROP DATABASE IF EXISTS `top_server` 这中注释有什么作用?
  5. php如何读取多个url文件,如何从PHP中的URL获取具有相同名称的多个参数
  6. java java se_Java SE 11:推动Java前进
  7. python propresql mysql_python数据库操作mysql:pymysql、sqlalchemy常见用法详解
  8. 《天天数学》连载23:一月二十三日
  9. mysql l查看历史等锁信息_mysql查看锁等信息SQL
  10. 属性匹配工具_k8s包管理工具Kustomize实战手册
  11. 中国队新主帅朱广沪印象
  12. matlab给语音信号添加噪声
  13. DOM控制video实现开始/暂停按钮思路方法
  14. Cesium中的几种坐标和相互转换
  15. css3制作菱形图片
  16. 天行健,君子以自强不息;地势坤,群子以厚德载物。
  17. linux中的网络指令ssh ifconfig netstat telnet curl scp
  18. 机器学习服务文本翻译能力升级,中文直译模型让译文表达更地道!
  19. 基于ESP32的WiFi-RSSI定位
  20. 彻底关闭windows Update服务

热门文章

  1. sql遍历所有数据集
  2. 将应用打包为 Snaps
  3. docker学习笔记(二)创建自己的镜像
  4. SpringBoot:切面AOP实现权限校验:实例演示与注解全解
  5. 加入知识星球(永久免费)
  6. 字节跳动---万万没想到之聪明的编辑
  7. 京东智联云分布式低延时RTC系统
  8. crond和crontab
  9. celery定时任务简单使用
  10. Dependency 'mysql:mysql-connector-java:5.1.28' not found【解决方案】