51nod 1211 数独

第1 - 9行,每行9个数中间用空格分隔,0表示该格子的数未知。
如果局面是不标准的,输出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 数独的更多相关文章
- 51 nod 1211 数独 DLX
原题链接:http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1211 调了挺久的,自己的一份舞蹈链模板…… 算是在网上见到的模 ...
- LintCode389.判断数独是否合法
LintCode简单题:判断数独是否合法 问题描述: 请判定一个数独是否有效. 该数独可能只填充了部分数字,其中缺少的数字用 . 表示. 注意事项: 一个合法的数独(仅部分填充)并不一定是可解的.我们 ...
- 【51Nod 1244】莫比乌斯函数之和
http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1244 模板题... 杜教筛和基于质因子分解的筛法都写了一下模板. 杜教筛 ...
- [LeetCode] Sudoku Solver 求解数独
Write a program to solve a Sudoku puzzle by filling the empty cells. Empty cells are indicated by th ...
- [LeetCode] Valid Sudoku 验证数独
Determine if a Sudoku is valid, according to: Sudoku Puzzles - The Rules. The Sudoku board could be ...
- 51Nod 1268 和为K的组合
51Nod 1268 和为K的组合 1268 和为K的组合 基准时间限制:1 秒 空间限制:131072 KB 分值: 20 难度:3级算法题 给出N个正整数组成的数组A,求能否从中选出若干个,使 ...
- 51Nod 1428 活动安排问题
51Nod 1428 活动安排问题 Link: http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1428 1428 活 ...
- 51Nod 1278 相离的圆
51Nod 1278 相离的圆 Link: http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1278 1278 相离的圆 基 ...
- 数独 JAVA实现
数独游戏的规则从很久之前就知道,但是一直都没怎么玩过,然后到了大学,大一下学期自己学dfs的时候,刚刚好碰到了一个数独的题目,做出来后,感觉还是挺有成就感的 然后大二学了JAVA,看了下那个一些有关于 ...
随机推荐
- PAT (Basic Level) Practise:1006. 换个格式输出整数
[题目链接] 让我们用字母B来表示“百”.字母S表示“十”,用“12...n”来表示个位数字n(<10),换个格式来输出任一个不超过3位的正整数.例如234应该被输出为BBSSS1234,因为它 ...
- hadoop之mapReduce踩坑集合
居然没有把这个目录,之前还想爆粗口的,还是算了. 上苷酸菜: 1.对于mapreduce中FileInputFormat只输入input文件根目录的方法尝试. 很简单好吧: step1: FileIn ...
- 了解 C++ 默默编写并调用的函数
前言 对于一个类来说,最最基础的三类成员函数莫过于:构造函数,析构函数以及拷贝函数 (copy构造函数和=重载函数).即使你的类没有为这些函数做出定义,C++ 也会自动为你创建.本文将讲述的是 C++ ...
- SpringMVC 产品笔记
假设我是springMVC的产品经理,我会怎么做? 恩,题目太大,能力不够,缓一缓. http://jinnianshilongnian.iteye.com/category/231099 http: ...
- Linux中“新旧”TCP/IP工具的对比
如今很多系统管理员依然通过组合使用诸如ifconfig.route.arp和netstat等命令行工具(统称为net-tools)来配置网络功能.解决网络故障,net-tools起源于BSD的TCP/ ...
- AndroidStudio导入Android-PullToRefresh
方法已经写到我的微信公众号中,公众号二维码在下面 本人联系方式: 更多精彩分享,可关注我的微信公众号: 若想给予我分享更多知识的动力,请扫描下面的微信打赏二维码,谢谢!: 微信号:WeixinJung ...
- CoderForces 280B(记忆化搜索)
题目大意:一个纸牌游戏,52张纸牌排成一列,每张纸牌有面值和花色两种属性.每次操作可以用最后一张纸牌将倒数第二张或者倒数第四张替换,但前提是两张牌的花色或者面值相同.问最终能否只剩一张牌. 题目分析: ...
- backtrack下whatweb的使用
whatweb是backtrack下的一款Web识别工具,位于 Applications-->BackTrack-->Information Gathing-->Web Applic ...
- json对象和字符串互相转换
- Linux驱动设计——阻塞和同步
阻塞和非阻塞是设备访问的两种基本方式,阻塞和非阻塞驱动程序使用时,经常会用到等待队列. 阻塞和非阻塞 阻塞操作是指在执行设备操作时,若不能获得资源,则挂起进程直到满足可操作的条件后再进行操作.被挂起的 ...