数独游戏规则如下:在9 * 9的盘面上有些已知的数字及未知的数字,推理出所有未知的数字,并满足每一行、每一列、每一个粗线宫内的数字均含1-9,不重复。

 
 
 
有些局面存在多个解或无解,这属于不标准的数独。对于不标准的局面,输出No Solution。
Input
第1 - 9行,每行9个数中间用空格分隔,0表示该格子的数未知。
Output
如果局面是不标准的,输出No Solution,否则数据具体的解。

转化为精确覆盖问题用dlx算法求解

共324列表示每行、列、3x3区域中有且只有每种数字一个,每个位置只能填一个数

共729行表示81个格子,填1~9的所有可能

#include<bits/stdc++.h>
const int N=;
int l[N],r[N],u[N],d[N],rid[N],cid[N],idp=,n0=;
int stk[],stp=,ed=;
int ds[][];
int vs[][],cs[];
void del(int mw){
l[r[mw]]=l[mw];
r[l[mw]]=r[mw];
for(int w=d[mw];w!=mw;w=d[w]){
for(int v=r[w];v!=w;v=r[v]){
u[d[v]]=u[v];
d[u[v]]=d[v];
--cs[cid[v]];
}
}
}
void ins(int mw){
l[r[mw]]=r[l[mw]]=mw;
for(int w=d[mw];w!=mw;w=d[w]){
for(int v=r[w];v!=w;v=r[v]){
u[d[v]]=d[u[v]]=v;
++cs[cid[v]];
}
}
}
bool dfs(){
if(r[n0]==n0){
if(ed)puts("No Solution"),exit();
ed=;
for(int i=;i<stp;++i){
int x=stk[i]-;
vs[x/+][x/%+]=x%+;
}
}
int mn=,mw=;
for(int w=r[n0];w!=n0;w=r[w])if(cs[w]<mn)mn=cs[mw=w];
del(mw);
for(int w=d[mw];w!=mw;w=d[w]){
stk[stp++]=rid[w];
for(int v=r[w];v!=w;v=r[v])del(cid[v]);
dfs();
for(int v=r[w];v!=w;v=r[v])ins(cid[v]);
--stp;
}
ins(mw);
return ;
}
int main(){
for(int i=;i<=;++i)for(int j=;j<=;++j)scanf("%d",vs[i]+j);
for(int i=;i<=;++i)for(int j=;j<=;++j)for(int k=;k<=;++k)if(!vs[i][j]||vs[i][j]==k){
int a=(i-)*+(j-)*+k;
ds[a][(i-)*+k]=++idp;
ds[a][+(j-)*+k]=++idp;
ds[a][+((i-)/*+(j-)/)*+k]=++idp;
ds[a][+(i-)*+j]=++idp;
}
for(int i=;i<=;++i){
l[i+]=i,r[i]=i+;
int p=i;
for(int j=;j<=;++j)if(int w=ds[j][i]){
d[p]=w,u[w]=p;
p=w;
++cs[i];
}
u[i]=p,d[p]=i;
if(!cs[i])return puts("No Solution"),;
}
l[]=n0,r[n0]=;
for(int i=;i<=;++i){
int p=,p0;
for(int j=;j<=;++j)if(int w=ds[i][j]){
if(p)r[p]=w,l[w]=p;
else p0=w;
p=w;
rid[w]=i;
cid[w]=j;
}
if(p)r[p]=p0,l[p0]=p;
}
dfs();
if(!ed)return puts("No Solution"),;
for(int i=;i<=;++i){
for(int j=;j<=;++j)printf("%d ",vs[i][j]);
putchar();
}
return ;
}

51nod 1211 数独的更多相关文章

  1. 51 nod 1211 数独 DLX

    原题链接:http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1211 调了挺久的,自己的一份舞蹈链模板…… 算是在网上见到的模 ...

  2. LintCode389.判断数独是否合法

    LintCode简单题:判断数独是否合法 问题描述: 请判定一个数独是否有效. 该数独可能只填充了部分数字,其中缺少的数字用 . 表示. 注意事项: 一个合法的数独(仅部分填充)并不一定是可解的.我们 ...

  3. 【51Nod 1244】莫比乌斯函数之和

    http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1244 模板题... 杜教筛和基于质因子分解的筛法都写了一下模板. 杜教筛 ...

  4. [LeetCode] Sudoku Solver 求解数独

    Write a program to solve a Sudoku puzzle by filling the empty cells. Empty cells are indicated by th ...

  5. [LeetCode] Valid Sudoku 验证数独

    Determine if a Sudoku is valid, according to: Sudoku Puzzles - The Rules. The Sudoku board could be ...

  6. 51Nod 1268 和为K的组合

    51Nod  1268  和为K的组合 1268 和为K的组合 基准时间限制:1 秒 空间限制:131072 KB 分值: 20 难度:3级算法题 给出N个正整数组成的数组A,求能否从中选出若干个,使 ...

  7. 51Nod 1428 活动安排问题

    51Nod   1428  活动安排问题 Link: http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1428 1428 活 ...

  8. 51Nod 1278 相离的圆

    51Nod 1278 相离的圆 Link: http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1278 1278 相离的圆 基 ...

  9. 数独 JAVA实现

    数独游戏的规则从很久之前就知道,但是一直都没怎么玩过,然后到了大学,大一下学期自己学dfs的时候,刚刚好碰到了一个数独的题目,做出来后,感觉还是挺有成就感的 然后大二学了JAVA,看了下那个一些有关于 ...

随机推荐

  1. hdu 4248 A Famous Stone Collector

    首先发现一个很头痛的问题,下面是2个求排列组合的代码 memset(C,,sizeof(C)); ;i<;i++) { C[i][]=; ;j<=;j++) C[i][j]=(C[i-][ ...

  2. 274. H-Index

    Given an array of citations (each citation is a non-negative integer) of a researcher, write a funct ...

  3. 矩阵基本运算的 Python 实现

    from...import与import区别在于import直接导入指定的库,而from....import则是从指定的库中导入指定的模块 import...as则是将import A as B,给予 ...

  4. codeforces magic five --快速幂模

    题目链接:http://codeforces.com/contest/327/problem/C 首先先算出一个周期里面的值,保存在ans里面,就是平常的快速幂模m做法. 然后要计算一个公式,比如有k ...

  5. php部分--操作MySQL 增删改查

    1.建立主页 并进行信息的显示和查询 <table width="95%" border="1" cellpadding="0" ce ...

  6. Codeforces Round #142 (Div. 2)

    A. Dragons 按\(x\)排序. B. T-primes \(x\)是平方数,且根\(\sqrt{x}\)是个质数. C. Shifts 枚举列的位置,对于每行来说,最多只会涉及4个列. D. ...

  7. HDU-5792 World is Exploding(树状数组)

    题目大意:给一个整数序列,统计四元组(a,b,c,d)的个数,满足条件1:a<>b<>c<>d:条件2:<a,b>组成一个顺序对,<c,d> ...

  8. 【NOIP2013】【P1441】花匠

    又一次看错题…… 原题: 花匠栋栋种了一排花,每株花都有自己的高度.花儿越长越大,也越来越挤.栋栋决定把这排中的一部分花移走,将剩下的留在原地,使得剩下的花能有空间长大,同时,栋栋希望剩下的花排列得比 ...

  9. 关于正则表达式处理textarea里的换行

    将textarea里的内容存入数据库时,会自动将回车换行符过滤成空格,也会将多个空格转换成一个空格,即:将\n等换成 “  ”存入数据库 因此为了将内容从数据库中按照原来格式读出写入到html 就必须 ...

  10. Linux平台下利用系统接口函数按照行读写文件

    要求:支持大文件(1M)一次性读入 源代码如下: #include<stdio.h> #include<fcntl.h> #include<stdlib.h> #i ...