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,看了下那个一些有关于 ...
随机推荐
- Windows 10下Chrome不能启动的问题
不能启动了 Chrome突然不能启动了,点击图标也没反应,打开任务管理器,发现点击图标后,Google Ghrome短暂地出现,随即消失. 如何解决? 解决方案 打开安装目录: C:\Program ...
- Sed 直接修改文件
sed最常用的用法莫过于替换文件,然而其默认的模式是直接输出在shell中 sed 's/Old/New/' My_File.txt 如果我们想要sed直接在文件中更改,只需要在sed后面添加 -i ...
- CentOS 6.3配置PPTP VPN的方法
1.验证ppp 用cat命令检查是否开启ppp,一般服务器都是开启的,除了特殊的VPS主机之外. [root@localhost1 /]# cat /dev/ppp cat: /dev/ppp: No ...
- addcontentView之后如何让这个view消失掉
Dia dialog ; public void go(View view){ dialog = (Dia) getLayoutInflater().inflate(R.layout.main, nu ...
- Sed简单入门实例
1. Sed简介 sed 是一种在线编辑器,它一次处理一行内容.处理时,把当前处理的行存储在临时缓冲区中,称为“模式空间”(pattern space),接着用sed命令处理缓冲区中的内容,处理完成后 ...
- 自己写getElementsByClass()方法
// 根据类名获取元素 function getElementsByClass(oParent,sClass){ var aResult = []; var aNode = oParent.getEl ...
- 水灾(sliker.cpp/c/pas) 1000MS 64MB
大雨应经下了几天雨,却还是没有停的样子.土豪CCY刚从外地赚完1e元回来,知道不久除了自己别墅,其他的地方都将会被洪水淹没. CCY所在的城市可以用一个N*M(N,M<=50)的地图表示,地图上 ...
- Android—菜单
layout文件: <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:an ...
- (译) 强化学习 第一部分:Q-Learning 以及相关探索
(译) 强化学习 第一部分:Q-Learning 以及相关探索 Q-Learning review: Q-Learning 的基础要点是:有一个关于环境状态S的表达式,这些状态中可能的动作 a,然后你 ...
- C语言 文件读取
FILE *fp = fopen("data.txt","rt");fscanf(fp,"%d", &n ); /* 把数据放到数组 ...