题目大意:

这是一个最简单的数独填充题目,题目保证只能产生一种数独,所以这里的初始9宫格较为稠密,可以直接dfs也没有问题

但最近练习dancing links,这类数据结构解决数独无疑效率会高很多

dancing links的数独限制条件是:

1.每行有9个元素,共9行 对应dlx81列

2.每列有9个元素,共9行 对应dlx81列

3.每个九宫格有9个元素,共9行 对应dlx81列

4.81个格子,每个格子最多有一个数

 #include <iostream>
#include <cstring>
#include <cstdio>
#include <algorithm>
#include <queue>
#include <climits>
#include <cmath> using namespace std;
#define N 1000
#define MAXNODE 1000000
const int INF = INT_MAX;
const double eps = 1e-; int a[][];
char str[]; int belong[][] = {
{,,,,,,,,},
{,,,,,,,,},
{,,,,,,,,},
{,,,,,,,,},
{,,,,,,,,},
{,,,,,,,,},
{,,,,,,,,},
{,,,,,,,,},
{,,,,,,,,},
};
struct DLX{
int n ,m , size;
int col[MAXNODE] , row[MAXNODE];
int U[MAXNODE] , D[MAXNODE] , L[MAXNODE] , R[MAXNODE];
int cnt_col[N] , first[N];
int ans[]; void init(int _n , int _m)
{
n = _n , m = _m;
size= m ;
for(int i= ; i<=m ; i++){
L[i] = i- , R[i] = i+;
U[i] = D[i] = i;
}
L[] = m , R[m] = ;
for(int i= ; i<=m ; i++) cnt_col[i] = ;
for(int i= ; i<=n ; i++) first[i] = -;
} void link(int r , int c)
{
++size;
U[D[c]] = size , D[size] = D[c];
U[size] = c , D[c] = size; if(first[r]<) L[size]=R[size]=first[r] = size;
else{
L[R[first[r]]] = size , R[size] = R[first[r]];
L[size] = first[r] , R[first[r]] = size;
}
row[size] = r , col[size] = c , cnt_col[c]++;
} void Remove(int c)
{
L[R[c]] = L[c] , R[L[c]] = R[c];
for(int i=D[c] ; i!=c ; i=D[i]){
for(int j=R[i] ; j!=i ; j=R[j]){
U[D[j]] = U[j] , D[U[j]] = D[j];
cnt_col[col[j]]--;
}
}
} void Resume(int c)
{
for(int i=U[c] ; i!=c ; i=U[i]){
for(int j=L[i] ; j!=i ; j=L[j]){
U[D[j]] = D[U[j]] = j;
cnt_col[col[j]]++;
}
}
L[R[c]] = R[L[c]] = c;
} bool Dance(int d)
{
if(!R[]){
for(int i= ; i<d ; i++){
int r = (ans[i]-)/;
int c = ((ans[i]-)%)/;
a[r][c] = ((ans[i]-)%)+;
}
return true;
}
int st=R[];
for(int i=R[] ; i!= ; i=R[i])
if(cnt_col[i]<cnt_col[st])
st = i;
Remove(st);
for(int i=D[st] ; i!=st ; i=D[i]){
ans[d] = row[i];
for(int j=R[i] ; j!=i ; j=R[j]) Remove(col[j]);
if(Dance(d+)) return true;
for(int j=L[i] ; j!=i ; j=L[j]) Resume(col[j]);
}
Resume(st);
return false;
} }dlx; void printM()
{
for(int i= ; i< ; i++)
for(int j= ; j< ; j++){
if(j<) printf("%d " , a[i][j]);
else printf("%d\n" , a[i][j]);
}
} int main()
{
// freopen("a.in" , "r" , stdin);
int index=;
bool flag = false;
while(~scanf("%s" , str))
{
if(flag) puts("");
flag = true;
if(str[] == '?') a[index/][index%] = ;
else a[index/][index%] = str[]-'';
index++;
while(index<){
scanf("%s" , str);
if(str[] == '?') a[index/][index%] = ;
else a[index/][index%] = str[]-'';
index++;
}
// printM();
dlx.init( , );
for(int i= ; i< ; i++)
for(int j= ; j< ; j++)
{
if(a[i][j]){
dlx.link((i*+j)*+a[i][j] , i*+a[i][j]);
dlx.link((i*+j)*+a[i][j] , +j*+a[i][j]);
dlx.link((i*+j)*+a[i][j] , +(belong[i][j]-)*+a[i][j]);
dlx.link((i*+j)*+a[i][j] , +i*+j+);
}
else{
for(int k= ; k<= ; k++){
dlx.link((i*+j)*+k , i*+k);
dlx.link((i*+j)*+k , +j*+k);
dlx.link((i*+j)*+k , +(belong[i][j]-)*+k);
dlx.link((i*+j)*+k , +i*+j+);
}
}
}
dlx.Dance(); printM();
index=;
} return ;
}

HDU 1426 dancing links解决数独问题的更多相关文章

  1. hihoCoder #1321 : 搜索五•数独 (Dancing Links ,精确覆盖)

    hiho一下第102周的题目. 原题地址:http://hihocoder.com/problemset/problem/1321 题意:输入一个9*9数独矩阵,0表示没填的空位,输出这个数独的答案. ...

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

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

  3. Dancing Links X 学习笔记

    \(\\\) Definitions 双向链表:记录前后两个指针的链表,每个顺序关系都有双向的指针维护. \(Dancing\ Links\):双向十字循环链表,建立在二维关系上,每个元素记录上下左右 ...

  4. [HDU1017]Exact cover[DLX][Dancing Links详解][注释例程学习法]

    Dancing Links解决Exact Cover问题. 用到了循环双向十字链表. dfs. 论文一知半解地看了一遍,搜出一篇AC的源码,用注释的方法帮助理解. HIT ACM 感谢源码po主.链接 ...

  5. 算法实践——舞蹈链(Dancing Links)算法求解数独

    在“跳跃的舞者,舞蹈链(Dancing Links)算法——求解精确覆盖问题”一文中介绍了舞蹈链(Dancing Links)算法求解精确覆盖问题. 本文介绍该算法的实际运用,利用舞蹈链(Dancin ...

  6. 转载 - 算法实践——舞蹈链(Dancing Links)算法求解数独

    出处:http://www.cnblogs.com/grenet/p/3163550.html 在“跳跃的舞者,舞蹈链(Dancing Links)算法——求解精确覆盖问题”一文中介绍了舞蹈链(Dan ...

  7. hdu 1426 Sudoku Killer ( Dancing Link 精确覆盖 )

    利用 Dancing Link 来解数独 详细的能够看    lrj 的训练指南 和 < Dancing Links 在搜索中的应用 >这篇论文 Dancing Link 来求解数独 , ...

  8. HDU 3335 Divisibility dancing links 重复覆盖

    分析: dlx重复覆盖的巧用,重复覆盖的原理恰好符合本题的筛选方式,即选择一个数后,该数的倍数或约数可以保证在之后的搜索中不会被选择 于是修改一下启发函数,求解最大的重复覆盖即可.   其实不一定不被 ...

  9. HDU 2295 Radar dancing links 重复覆盖

    就是dancing links 求最小支配集,重复覆盖 精确覆盖时:每次缓存数据的时候,既删除行又删除列(这里的删除列,只是删除表头) 重复覆盖的时候:只删除列,因为可以重复覆盖 然后重复覆盖有一个估 ...

随机推荐

  1. PowerShell~发布你的mvc网站

    通过使用ps加上msbuild可以方便的编译你的.net应用程序,并且可以把它发布到你的磁盘上,部署非常方例! 我们在c盘添加一个hello网站,解决方案名是hello.sln,它的网站是hello. ...

  2. oracle 权限、规则

    Oracle中关于权限与规则简单总结: --1,管理员登录 conn sys/orcl@orcl as sysdba; --2,创建用户方案---必须管理员身份才能操作 create user use ...

  3. 【转】Iconfont

    Iconfont Iconfont 是指用字体文件取代图片文件,来展示图标.特殊字体等元素的一种方法.很多网站都会用它,比如手淘.新浪微博等. 在使用它之前,先来了解一下它的优缺点: 优点:(1)文件 ...

  4. 【学习笔记】深入理解js原型和闭包(16)——完结

    之前一共用15篇文章,把javascript的原型和闭包讲解了一下. 首先,javascript本来就“不容易学”.不是说它有多难,而是学习它的人,往往都是在学会了其他语言之后,又学javascrip ...

  5. MongoDB部署、使用、监控及调优

    MongoDB部署 系统环境:CentOS7   下载地址:http://mirrors.163.com/centos/7.6.1810/isos/x86_64/CentOS-7-x86_64-DVD ...

  6. eclipse搭建android开发环境详细步骤

    搭建android应用的开发环境,一套程序下来也是相当繁琐的,这里我整理下一整套详细流程: 1,下载JDK 去oracle官网下载最新版本的jdk,官网地址 http://www.oracle.com ...

  7. 8 Explicit Animations 指明的动画 笔记

    8 Explicit Animations 指明的动画 笔记     If you want something done right, do it yourself. 如果你想让事情做好,那就自动来 ...

  8. 洛谷 P1434 滑雪

    题目描述 Michael喜欢滑雪.这并不奇怪,因为滑雪的确很刺激.可是为了获得速度,滑的区域必须向下倾斜,而且当你滑到坡底,你不得不再次走上坡或者等待升降机来载你.Michael想知道在一个区域中最长 ...

  9. ftp 报错 200 Type set to A

    最近在使用ssis 从ftp服务器抓起文件到本地的时候,发现连接ftp出错 200 Type set to A 解决办法: ftp connection 中 设置UsePassiveMode 为Tru ...

  10. javaee 第七周作业

    一.什么是JSON? JSON(JavaScript Object Notation, JS 对象简谱) 是一种轻量级的数据交换格式.它基于 ECMAScript (欧洲计算机协会制定的js规范)的一 ...