题目大意:

这是一个最简单的数独填充题目,题目保证只能产生一种数独,所以这里的初始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. Pycharm中pygame报错

    什么鬼???我记得刚安装过啊-.. 并且本机只有一个python3.5,环境变量之前都是正常,我去折腾了大半天,原来在pycharm中安装模块是在如下所示图中 以后如果没有安装模块,都可以在这里进行安 ...

  2. PowerShell~语法与运算符

    基本语法 变量:$开头 $a = "Hello" 条件语句:if else ) { Write-Host "偶数" } else{ Write-Host &qu ...

  3. angularjs <input>标签获取时间显示问题

    一般的后台管理中,几乎每个管理后台都有设置新密码的功能,但是获取的时候为了好看,都有统一用一定的标签,比如input标签,ng-model来控制显示数据,但是在获取时间的时候用会显示错乱 代码为: & ...

  4. AJPFX关于对集合中的元素删除操作和注意点

    import java.util.ArrayList;import java.util.Iterator;import java.util.List; public class ForeTest2 { ...

  5. jsonp对付同源策略

    当 协议不同或者域名/ip不同或者端口号不同 ,  都不算是同源 这时候 源生的ajax 就不能进行数据请求了 JSONP json with padding 在平时的开发中也发现了  ,当我们请求  ...

  6. php中的define()函数

    <?php define("PI",3.1415926); //定义常量 $r=12;//定义圆半径 echo "半径为12的单位的圆的面积".PI*($ ...

  7. Java replaceAll不区分大小写

    Java 中replaceAll如何忽略大小写呢? 方式一:在正则表达式前面添加(?i) @Test public void test_replaceAll33(){ String input = & ...

  8. vue+element ui项目总结点(一)select、Cascader级联选择器、encodeURI、decodeURI转码解码、mockjs用法、路由懒加载三种方式

    不多说上代码: <template> <div class="hello"> <h1>{{ msg }}</h1> <p> ...

  9. js图片轮播效果常见的产品无缝轮播

    <!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <m ...

  10. springmvc+maven搭建web项目之二 通过另一种方式配置spring

    1.创建maven web项目 2. 配置pom.xml <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:x ...