POJ3076 Sudoku 舞蹈链 DLX
欢迎访问~原文出处——博客园-zhouzhendong
去博客园看该题解
题目(传送门)
题意概括
给出一个残缺的16*16数独,求解。
题解
学完这个之后,再思考这一题。同样,每个位置每种取值4个信息。
数独共256个格子,每个格子都得填一个数,那么,我们要精确覆盖每一个格子,所以我们首先建立1~256列。
然后还有16行,每行1~16,每行都得精确覆盖,16行,又得建立16*16=256列;
然后还有16列,每列1~16,同理。
然后还有16个4*4的小格子,每个里面1~16,也同理。
那么总共要建立4*256=1024列。
代码
- #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 a[][],x[N],y[N],z[N];
- char s[];
- int hash(int a,int b,int c){
- return a*+b*+c+;
- }
- int main(){
- while (~scanf("%s",s+)){
- for (int i=;i<=;i++){
- for (int j=;j<=;j++)
- if (s[j]=='-')
- a[i][j]=;
- else
- a[i][j]=s[j]-'A'+;
- if (i<)
- scanf("%s",s+);
- }
- 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("%c",a[i][j]+'A'-);
- puts("");
- }
- return ;
- }
POJ3076 Sudoku 舞蹈链 DLX的更多相关文章
- POJ3074 Sudoku 舞蹈链 DLX
欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题目(传送门) 题意概括 给出一个残缺的数独,求解. 题解 DLX + 矩阵构建 (两个传送门) 代码 #include & ...
- POJ2676 Sudoku 舞蹈链 DLX
欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题目(传送门) 题意概括 给出一个残缺的数独,求解.SPJ 题解 DLX + 矩阵构建 (两个传送门) 代码 #includ ...
- 舞蹈链 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 ...
随机推荐
- SQL Server代码段
1.cast和convert ' as int) -- 123 ') -- 123 select CAST(123.4 as int) -- 123 select CONVERT(int, 123.4 ...
- 【原创】大数据基础之Benchmark(2)TPC-DS
tpc 官方:http://www.tpc.org/ 一 简介 The TPC is a non-profit corporation founded to define transaction pr ...
- Netflix正式开源其API网关Zuul 2
5 月 21 日,Netflix 在其官方博客上宣布正式开源微服务网关组件 Zuul 2.Netflix 公司是微服务界的楷模,他们有大规模生产级微服务的成功应用案例,也开源了相当多的微服务组件(详见 ...
- Winform中的TextBox的小技巧
1 一些常用属性this.textBox5.PasswordChar = '@'; //密码的样式 this.textBox5.UseSystemPasswordChar = ...
- Confluence 6 管理协同编辑
协同编辑能够让项目小组中的协同合作达到下一个高度.这个页面对相关协同编辑中的问题进行了讨论,能够提供给你所有希望了解的内容. 进入 Collaborative editing 页面来获得项目小组是如何 ...
- Confluence 6 缓存性能示例
有关 Confluence 的缓存性能如何设置,让我们看看下面的表: 缓存(Caches) % 使用的缓存(Used) % 有效率(Effectiveness) 对象/大小(Objects/Size) ...
- CentOS7图形界面与命令行界面切换(转载)
在图形界面使用 ctrl+alt+F2切换到dos界面 dos界面 ctrl+alt+F2切换回图形界面 在命令上 输入 init 3 命令 切换到dos界面 输入 init 5命令 切换到图形界面 ...
- exec与match方法的区别
http://www.cnblogs.com/xiehuiqi220/archive/2008/11/05/1327487.html var someText= "web2.0 .net2. ...
- java易错题----静态方法的调用
class A{ public static String s="A.s"; } class B extends A{ public static String s="B ...
- 在lnmp环境下,将原来的PHP7.0升级到PHP7.2
基础环境: 系统:centos6.8 环境:lnmp 停止PHP7.0的版本,在做如下操作: 1.下载php-7.2.6.tar.bz2软件包放在/opt 路径下 mkdir /usr/local ...