POJ2676 Sudoku 舞蹈链 DLX
欢迎访问~原文出处——博客园-zhouzhendong
去博客园看该题解
题目(传送门)
题意概括
给出一个残缺的数独,求解。SPJ
题解
代码
- #include <cstring>
- #include <cstdio>
- #include <algorithm>
- #include <cstdlib>
- #include <cmath>
- using namespace std;
- const int N=,M=,S=N*+M;
- struct DLX{
- int n,m,cnt;
- int x[S],y[S],L[S],R[S],U[S],D[S];
- int C[M],anscnt,ans[N];
- void init(int c){
- memset(x,,sizeof x);
- memset(y,,sizeof y);
- memset(L,,sizeof L);
- memset(R,,sizeof R);
- memset(U,,sizeof U);
- memset(D,,sizeof D);
- memset(C,,sizeof C);
- memset(ans,,sizeof ans);
- anscnt=;
- m=c;
- for (int i=;i<=m;i++)
- L[i]=i-,R[i]=i+,U[i]=D[i]=i;
- L[]=m,R[m]=,cnt=m;
- }
- void link(int i,int j){
- cnt++;
- x[cnt]=i;
- y[cnt]=j;
- L[cnt]=cnt-;
- R[cnt]=cnt+;
- D[cnt]=j;
- D[U[j]]=cnt;
- U[cnt]=U[j];
- U[j]=cnt;
- C[j]++;
- }
- void Delete(int k){
- L[R[k]]=L[k];
- R[L[k]]=R[k];
- for (int i=D[k];i!=k;i=D[i])
- for (int j=R[i];j!=i;j=R[j]){
- U[D[j]]=U[j];
- D[U[j]]=D[j];
- C[y[j]]--;
- }
- }
- void Reset(int k){
- L[R[k]]=k;
- R[L[k]]=k;
- for (int i=U[k];i!=k;i=U[i])
- for (int j=L[i];j!=i;j=L[j]){
- U[D[j]]=j;
- D[U[j]]=j;
- C[y[j]]++;
- }
- }
- bool solve(){
- if (R[]==)
- return true;
- anscnt++;
- int k=R[];
- for (int i=R[k];i!=;i=R[i])
- if (C[i]<C[k])
- k=i;
- Delete(k);
- for (int i=D[k];i!=k;i=D[i]){
- ans[anscnt]=x[i];
- for (int j=R[i];j!=i;j=R[j])
- Delete(y[j]);
- if (solve())
- return true;
- for (int j=L[i];j!=i;j=L[j])
- Reset(y[j]);
- }
- Reset(k);
- anscnt--;
- return false;
- }
- }dlx;
- int T,a[][],x[],y[],z[];
- char s[];
- int hash(int a,int b,int c){
- return a*+b*+c+;
- }
- int main(){
- scanf("%d",&T);
- while (T--){
- for (int i=;i<=;i++){
- scanf("%s",s+);
- for (int j=;j<=;j++)
- a[i][j]=s[j]-;
- }
- dlx.init(**);
- int Row=;
- for (int i=;i<=;i++)
- for (int j=;j<=;j++){
- int st,en;
- if (a[i][j]==)
- st=,en=;
- else
- st=en=a[i][j];
- for (int k=st;k<=en;k++){
- Row++;
- x[Row]=i,y[Row]=j,z[Row]=k;
- int first=dlx.cnt+;
- dlx.link(Row,hash(,i-,j-));
- dlx.link(Row,hash(,i-,k-));
- dlx.link(Row,hash(,j-,k-));
- dlx.link(Row,hash(,((i-)/)*+(j-)/,k-));
- dlx.L[first]=dlx.cnt;
- dlx.R[dlx.cnt]=first;
- }
- }
- bool found=dlx.solve();
- for (int i=;i<=dlx.anscnt;i++)
- a[x[dlx.ans[i]]][y[dlx.ans[i]]]=z[dlx.ans[i]];
- for (int i=;i<=;puts(""),i++)
- for (int j=;j<=;j++)
- printf("%d",a[i][j]);
- }
- return ;
- }
POJ2676 Sudoku 舞蹈链 DLX的更多相关文章
- POJ3076 Sudoku 舞蹈链 DLX
欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题目(传送门) 题意概括 给出一个残缺的16*16数独,求解. 题解 DLX + 矩阵构建 (两个传送门) 学完这个之后,再 ...
- POJ3074 Sudoku 舞蹈链 DLX
欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题目(传送门) 题意概括 给出一个残缺的数独,求解. 题解 DLX + 矩阵构建 (两个传送门) 代码 #include & ...
- 舞蹈链 DLX
欢迎访问——该文出处-博客园-zhouzhendong 去博客园看该文章--传送门 舞蹈链是一个非常玄学的东西…… 问题模型 精确覆盖问题:在一个01矩阵中,是否可以选出一些行的集合,使得在这些行的集 ...
- [学习笔记] 舞蹈链(DLX)入门
"在一个全集\(X\)中若干子集的集合为\(S\),精确覆盖(\(\boldsymbol{Exact~Cover}\))是指,\(S\)的子集\(S*\),满足\(X\)中的每一个元素在\( ...
- [poj3074]Sudoku(舞蹈链)
题目链接:http://poj.org/problem?id=3074 舞蹈链精确覆盖的经典题目,一个数独每个位置的要求,可以得到以下四个约束1.每个位置有且只有一个数字2.每个位置的数字在一行只能出 ...
- luogu P4929 【模板】舞蹈链 DLX
LINK:舞蹈链 具体复杂度我也不知道 但是 搜索速度极快. 原因大概是因为 每次检索的时间少 有一定的剪枝. 花了2h大概了解了这个东西 吐槽一下题解根本看不懂 只能理解大概的想法 核心的链表不太懂 ...
- Vijos1755 靶形数独 Sudoku NOIP2009 提高组 T4 舞蹈链 DLX
欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题目(传送门) 题意概括 给出一个残缺的数独,求这个数独中所有的解法中的最大价值. 一个数独解法的价值之和为每个位置所填的数值 ...
- P4929-[模板]舞蹈链(DLX)
正题 题目链接:https://www.luogu.com.cn/problem/P4929 题目大意 \(n*m\)的矩形有\(0/1\),要求选出若干行使得每一列有且仅有一个\(1\). 解题思路 ...
- 关于用舞蹈链DLX算法求解数独的解析
欢迎访问——该文出处-博客园-zhouzhendong 去博客园看该文章--传送门 描述 在做DLX算法题中,经常会做到数独类型的题目,那么,如何求解数独类型的题目?其实,学了数独的构建方法,那么DL ...
随机推荐
- Linux 两组信号对比(关闭和停止进程信号)
之前看信号的时候,没有太注意不同信号的对比.今天再次看到的时候,突然感觉对一些信号,非常相似,乃至非常容易混淆.今天周末就抽空总结一下. 一.关闭进程信号 常见的4中关闭进程信号是SIGKILL,SI ...
- CentOS 7安装Python3.5
CentOS 7下安装Python3.5 •安装python3.5可能使用的依赖 yum install openssl-devel bzip2-devel expat-devel gdbm-deve ...
- 洛谷P4389 付公主的背包 [生成函数,NTT]
传送门 同样是回过头来发现不会做了,要加深一下记忆. 思路 只要听说过生成函数的人相信第一眼都可以想到生成函数. 所以我们要求 \[ ans=\prod \sum_n x^{nV}=\prod \fr ...
- Codeforces 993E Nikita and Order Statistics [FFT]
洛谷 Codeforces 思路 一开始想偏想到了DP,后来发现我SB了-- 考虑每个\(a_i<x\)的\(i\),记录它前一个和后一个到它的距离为\(L_i,R_i\),那么就有 \[ an ...
- springmvc框架原理分析和简单入门程序
一.什么是springmvc? 我们知道三层架构的思想,并且如果你知道ssh的话,就会更加透彻的理解这个思想,struts2在web层,spring在中间控制,hibernate在dao层与数据库打交 ...
- SVG前戏—让你的View多姿多彩
什么是SVG SVG的全称是Scalable Vector Graphics,叫可缩放矢量图形.是一种基于可扩展标记语言(XML).它和位图(Bitmap)相对,SVG不会像位图一样因为缩放而让图片质 ...
- 树形dp 入门
今天学了树形dp,发现树形dp就是入门难一些,于是好心的我便立志要发一篇树形dp入门的博客了. 树形dp的概念什么的,相信大家都已经明白,这里就不再多说.直接上例题. 一.常规树形DP P1352 没 ...
- popup的简单应用举例(具体在增删改查组件中用到)以及补充的知识点
一.首先说一下自执行函数 1. 立即执行函数是什么?也就是匿名函数 立即执行函数就是 声明一个匿名函数 马上调用这个匿名函数 2.popup的举例 点击,弹出一个新的窗口.保存完事,页面不刷新数据就返 ...
- django rest framework(3)
目录 一.版本 二.解析器 三.序列化 四.请求数据验证 一.版本 程序也来越大时,可能通过版本不同做不同的处理 没用rest_framework之前,我们可以通过以下这样的方式去获取. class ...
- dubbo源码之服务发布与注册
服务端发布流程: dubbo 是基于 spring 配置来实现服务的发布的,对于dubbo 配置文件中看到的<dubbo:service>等标签都是服务发布的重要配置 ,对于这些提供可配置 ...