数独游戏规则如下:在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. 关于时间的util类,以后方便查阅

    public static int lastDayOfMonth(int year, int month)  {    if (month == 2)    {      if (isLeapYear ...

  2. sqlite字符反向模糊查找

    sqlite 一个短字符要去db里模糊查找时,可以用like 如select * from t_contact where uphone like '%1234%'; 但是当输入的字符串超过数据库里的 ...

  3. LB负载均衡集群及DR模式配置

    一.系统环境准备: 1.dir服务器 主机名称:dir 系统环境:CentOS release 6.5 (Final) 外网ip:192.168.1.203(网络模式桥接) vip:192.168.1 ...

  4. Codeforces Round #373 (Div. 1)

    Codeforces Round #373 (Div. 1) A. Efim and Strange Grade 题意 给一个长为\(n(n \le 2 \times 10^5)\)的小数,每次可以选 ...

  5. LeetCode() Valid Anagram 有问题!!!

    为什么第一个通过,第二个不行呢? class Solution { public: bool isAnagram(string s, string t) { if(s.size() != t.size ...

  6. 归并排序 空间复杂度为O(1)的做法

    #include <iostream> #include <cstdlib> using namespace std; void print(int *arr, int sta ...

  7. Python文件格式化写入

    [root@localhost test]# cat 1.py fd = open('format.txt','w') head = "%10s%10s%10s\n"%('id', ...

  8. java编程之:Unsafe类

    Unsafe类在jdk 源码的多个类中用到,这个类的提供了一些绕开JVM的更底层功能,基于它的实现可以提高效率.但是,它是一把双刃剑:正如它的名字所预示的那样,它是 Unsafe的,它所分配的内存需要 ...

  9. Linux comands

    https://www.mankier.com/8/vmstat http://docs.oracle.com/cd/E23824_01/html/821-1451/spmonitor-22.html ...

  10. div下的img标签中图片的大小设定

    首先html为: <div class="box1"><img src="images/more-1.jpg"></div> ...