HDU 3111 Sudoku(精确覆盖)
数独问题,输入谜题,输出解
既然都把重复覆盖的给写成模板了,就顺便把精确覆盖的模板也写好看点吧。。。赤裸裸的精确覆盖啊~~~水一水~~~然后继续去搞有点难度的题了。。。
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#include <cmath>
#include <string>
#include <vector>
#include <queue>
#include <set>
using namespace std; #define ll long long
#define eps 1e-8
#define mod 21092013 #define inf 0x3f3f3f3f
#define maxr 777
#define maxn (maxr*maxr)
int n,m;
int L[maxn],R[maxn],U[maxn],D[maxn],cnt;
int row[maxn],col[maxn];
int N[maxr],use[maxr],head[maxr];
void init(){
memset(head,-,sizeof(head));
memset(N,,sizeof(N));
for(int i=;i<=m;++i){
L[i]=i-,R[i]=i+;
U[i]=D[i]=i;
row[i]=,col[i]=i;
}
L[]=m,R[m]=;
cnt=m;
}
void remove(int c){// 删除列以及所在列含有1的行
L[R[c]]=L[c],R[L[c]]=R[c];
for(int i=D[c];i!=c;i=D[i])
for(int j=R[i];j!=i;j=R[j])
U[D[j]]=U[j],D[U[j]]=D[j],--N[col[j]];
}
void resume(int c){// 恢复列以及所在列含有1的行
for(int i=U[c];i!=c;i=U[i])
for(int j=L[i];j!=i;j=L[j])
U[D[j]]=D[U[j]]=j,++N[col[j]];
L[R[c]]=R[L[c]]=c;
}
int low(){
int mi=maxr,idx=;
for(int i=R[];i;i=R[i])if(N[i]<mi&&N[i])mi=N[i],idx=i;
return idx;
}
void link(int r,int c){
++N[c],++cnt;
row[cnt]=r,col[cnt]=c;
U[cnt]=U[c],D[cnt]=c;
U[D[cnt]]=D[U[cnt]]=cnt;
if(head[r]==-)
head[r]=L[cnt]=R[cnt]=cnt;
else {
L[cnt]=L[head[r]];
R[cnt]=head[r];
L[R[cnt]]=R[L[cnt]]=cnt;
}
}
int xy[maxr][];char num[maxr];
char ch[][];
bool dance(int dep){
if(R[]==)return true;
int c=low();
if(c==)return false;
for(int i=D[c];i!=c;i=D[i]){
int r=row[i];
ch[xy[r][]][xy[r][]]=num[r];
use[dep]=i;
remove(col[i]);
for(int j=R[i];j!=i;j=R[j])remove(col[j]);
if(dance(dep+))return true;
for(int j=L[i];j!=i;j=L[j])resume(col[j]);
resume(col[i]);
}
return false;
} int main(){
int t,ca=;
scanf("%d",&t);
while(t--){
if(ca)scanf("%s",ch[]);
if(ca)puts("---");
ca=;
n=,m=;
init();
for(int i=;i<=;++i)scanf("%s",ch[i]+);
for(int i=;i<=;++i){
for(int j=;j<=;++j){
if(ch[i][j]>=''&&ch[i][j]<=''){
int val=ch[i][j]-'';
++n;
link(n,(i-)*+val);
link(n,+(j-)*+val);
link(n,+(i-)*+j);
link(n,+((i-)/*+(j+)/-)*+val );
xy[n][]=i,xy[n][]=j;
num[n]=val+'';
}
else {
for(int k=;k<=;++k){
int val=k;
++n;
link(n,(i-)*+val);
link(n,+(j-)*+val);
link(n,+(i-)*+j);
link(n,+((i-)/*+(j+)/-)*+val );
xy[n][]=i,xy[n][]=j;
num[n]=val+'';
}
}
}
}
if(dance())for(int i=;i<=;++i)printf("%s\n",ch[i]+);
else puts("impossible");
}
return ;
}
HDU 3111 Sudoku(精确覆盖)的更多相关文章
- HDU 3111 Sudoku ( Dancing Links 精确覆盖模型 )
推荐两篇学DLX的博文: http://bbs.9ria.com/thread-130295-1-1.html(这篇对DLX的工作过程演示的很详细) http://yzmduncan.iteye.co ...
- hdu 1426 Sudoku Killer ( Dancing Link 精确覆盖 )
利用 Dancing Link 来解数独 详细的能够看 lrj 的训练指南 和 < Dancing Links 在搜索中的应用 >这篇论文 Dancing Link 来求解数独 , ...
- POJ 3076 Sudoku DLX精确覆盖
DLX精确覆盖模具称号..... Sudoku Time Limit: 10000MS Memory Limit: 65536K Total Submissions: 4416 Accepte ...
- (简单) POJ 3074 Sudoku, DLX+精确覆盖。
Description In the game of Sudoku, you are given a large 9 × 9 grid divided into smaller 3 × 3 subgr ...
- POJ 3074 Sudoku DLX精确覆盖
DLX精确覆盖.....模版题 Sudoku Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 8336 Accepted: ...
- HDU 3957 Street Fighter(搜索、DLX、重复覆盖+精确覆盖)
很久以前就看到的一个经典题,一直没做,今天拿来练手.街霸 给n<=25个角色,每个角色有 1 or 2 个版本(可以理解为普通版以及爆发版),每个角色版本可以KO掉若干人. 问最少选多少个角色( ...
- [DLX精确覆盖] hdu 1603 A Puzzling Problem
题意: 给你n块碎片,这些碎片不能旋转.翻折. 问你能不能用当中的某些块拼出4*4的正方形. 思路: 精确覆盖裸题了 建图就是看看每一个碎片在4*4中能放哪些位置,这个就作为行. 列就是4*4=16个 ...
- HDU 3957 Street Fighter (最小支配集 DLX 重复覆盖+精确覆盖 )
DLX经典题型,被虐惨了…… 建一个2*N行3*N列的矩阵,行代表选择,列代表约束.前2*N列代表每个人的哪种状态,后N列保证每个人至多选一次. 显然对手可以被战胜多次(重复覆盖),每个角色至多选择一 ...
- [DLX精确覆盖] hdu 3663 Power Stations
题意: 给你n.m.d,代表有n个城市.m条城市之间的关系,每一个城市要在日后d天内都有电. 对于每一个城市,都有一个发电站,每一个发电站能够在[a,b]的每一个连续子区间内发电. x城市发电了.他相 ...
随机推荐
- Junit初级编码(一)第一个Junit测试程序
序,Junit测试是单元测试的一个框架,提供了很多方法,供我们快速开展单元测试.目前最新版本JAR包为4.12,官网地址为http://junit.org/ 一.第一个Junit测试程序 1 去官网下 ...
- AlwaysOn可用性组功能测试(一)--AlwaysOn故障转移测试
具体测试环境请参考: AlwaysOn可用性组测试环境安装与配置(一)--SQL群集环境搭建 AlwaysOn可用性组测试环境安装与配置(二)--AlwaysOn配置(界面与T-SQL) 一. Alw ...
- HDOJ 3507 Print Article
Print Article Time Limit: 9000/3000 MS (Java/Others) Memory Limit: 131072/65536 K (Java/Others)To ...
- 修改Ubuntu12.04 左侧启动器Launcher图标大小,以及如何隐藏启动器?
在 VirtualBox 中安装了 Ubuntu 12,一直使用 2D 桌面,3D桌面没用上,估计是电脑配置低的问题. 左边启动器的图标特别大,占据了很多的桌面空间,打算调小点.奇怪的是,在“系统设置 ...
- Android 全屏显示
Android全屏显示: @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInst ...
- sql存储过程几个简单例子
导读:sql存储是数据库操作过程中比较重要的一个环节,对于一些初学者来说也是比较抽象难理解的,本文我将通过几个实例来解析数据库中的sql存储过程,这样就将抽象的事物形象化,比较容易理解. 例1: cr ...
- hash-4.hashtable
1.先看hashtable的源代码 public synchronized V put(K key, V value) { // Make sure the value is not null if ...
- LESS介绍及其与Sass的差异
自从一个月前我偶然发现LESS之后我就开始坚定的使用它了.CSS本身对我来说从来不是问题,但是我很好奇使用变量来沿着一个调色盘为我的网站或模板创建一些东西的想法.拥有一个提供固定数量选项可选的色盘可以 ...
- HttpClient session
session概述 session机制 session机制是一种服务器端的机制,服务器使用一种类似于散列表的结构(也可能就是使用散列表)来保存信息. 当程序需要为某个客户端的请求创建一个session ...
- aspcms 留言 搜索
留言: <form method='POST' name='myform' onSubmit='return metmessagesubmit("姓名不能为空"," ...