数独游戏规则如下:在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. dalvik虚拟内存管理之三——调试信息

    转载自http://www.miui.com/thread-75063-1-1.html 1. verbosegc一般Java虚拟机要求支持verbosegc选项,输出详细的垃圾收集调试信息.dalv ...

  2. codeforce Group Photo 2 (online mirror version)

    题目大意: 有n个矩形在地上排成一列,不可重叠,已知他们的宽度w和高度h,现在使至多[n / 2]个矩形旋转90度,问最后可以用多小的矩形恰好覆盖这n个矩形,求满足条件的最小矩形面积. n, w, h ...

  3. XACT_ABORT 用法

    首先创建一张表 Create Table TranTable(    Id INT IDENTITY(1,1) PRIMARY KEY,    Priority TINYINT--最大值255) 1. ...

  4. 关于kinect的安装与配置工作

    一 关于kinect的安装与配置工作 首先要注意的是,使用kinect进行开发,目前有两种不同的驱动方案,经测试这两种方案的驱动是不能兼容的,所以请务必选定其中一种(最好是卸载另外一种). 方案一:使 ...

  5. Notes of Principles of Parallel Programming: Peril-L Notation - TODO

    Content 1 syntax and semantic 2 example set 1 syntax and semantic 1.1 extending C Peril-L notation s ...

  6. 矩阵卷积Matlab(转载)

    转载自:http://blog.csdn.net/anan1205/article/details/12313593 两个矩阵卷积转化为矩阵相乘形式--Matlab应用(这里考虑二维矩阵,在图像中对应 ...

  7. C++ Primer : 第十二章 : 动态内存之allocator类

    标准库allocator类定义在头文件 <memory>中.它帮助我们将内存分配和构造分离开来,它分配的内存是原始的.未构造的. 类似vector,allocator也是一个模板类,我们在 ...

  8. error_log() 范例

    <?php// 如果无法连接到数据库,发送通知到服务器日志if (!Ora_Logon($username, $password)) {    error_log("Oracle da ...

  9. 救援行动(save) (BFS)

    时间限制: 1 Sec  内存限制: 64 MB提交: 42  解决: 9[提交][状态][讨论版] 题目描述 Angel被人抓住关在一个迷宫了!迷宫的长.宽均不超过200,迷宫中有不可以越过的墙以及 ...

  10. LeetCode(228) Summary Ranges

    Given a sorted integer array without duplicates, return the summary of its ranges. For example, give ...