(中等) HDU 4069 Squiggly Sudoku , DLX+精确覆盖。
Description
Left figure is the puzzle and right figure is one solution.

Now, give you the information of the puzzle, please tell me is there no solution or multiple solution or one solution.
#include<iostream>
#include<cstring>
#include<cstdio>
#include<queue> using namespace std; const int MaxN=;
const int MaxM=;
const int MaxNode=MaxN*MaxM; int map1[][]; struct DLX
{
int U[MaxNode],D[MaxNode],L[MaxNode],R[MaxNode],col[MaxNode],row[MaxNode];
int size,n,m;
int H[MaxN],S[MaxM];
int ans[],ans1[],anst[];
int ansnum,depth; void init(int _n,int _m)
{
ansnum=; n=_n;
m=_m; for(int i=;i<=m;++i)
{
U[i]=D[i]=i;
L[i]=i-;
R[i]=i+;
row[i]=; S[i]=;
}
L[]=m;
R[m]=; size=m; for(int i=;i<=n;++i)
H[i]=-;
} void Link(int r,int c)
{
col[++size]=c;
row[size]=r;
++S[c]; U[size]=U[c];
D[size]=c;
D[U[c]]=size;
U[c]=size; if(H[r]==-)
H[r]=L[size]=R[size]=size;
else
{
L[size]=L[H[r]];
R[size]=H[r];
R[L[H[r]]]=size;
L[H[r]]=size;
}
} void remove(int c)
{
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];
--S[col[j]];
}
} void resume(int c)
{
for(int i=U[c];i!=c;i=U[i])
for(int j=L[i];j!=i;j=L[j])
{
U[D[j]]=j;
D[U[j]]=j;
++S[col[j]];
} L[R[c]]=R[L[c]]=c;
} void showans()
{
for(int i=;i<depth;++i)
ans1[(anst[i]-)/+]=(anst[i]-)%+; for(int i=;i<=;++i)
{
cout<<ans1[i]; if(i%==)
cout<<endl;
}
} void copyans()
{
for(int i=;i<;++i)
anst[i]=ans[i];
} bool Dance(int d)
{
if(R[]==)
{
depth=d; if(ansnum)
{
++ansnum;
return ;
} ++ansnum; copyans(); return ;
} int c=R[]; for(int i=R[];i!=;i=R[i])
if(S[i]<S[c])
c=i; remove(c); for(int i=D[c];i!=c;i=D[i])
{
ans[d]=row[i]; for(int j=R[i];j!=i;j=R[j])
remove(col[j]); if(Dance(d+))
return ; for(int j=L[i];j!=i;j=L[j])
resume(col[j]);
} resume(c); return ;
} void display()
{
for(int i=R[];i!=;i=R[i])
{
cout<<i<<' ';
for(int j=D[i];j!=i;j=D[j])
cout<<'('<<j<<','<<(row[j]-)%+<<')'<<' '; cout<<endl;
}
}
}; DLX dlx;
int s[]; void getchange(int &r,int &c1,int &c2,int &c3,int &c4,int i,int j,int k)
{
r=(i*+j)*+k;
c1=i*+j+;
c2=i*+k+;
c3=j*+k+;
c4=map1[i][j]*+k+;
} void slove()
{
int r,c1,c2,c3,c4; dlx.init(,); for(int i=;i<;++i)
for(int j=;j<;++j)
for(int k=;k<=;++k)
if(s[i*+j]== || s[i*+j]==k)
{
getchange(r,c1,c2,c3,c4,i,j,k); dlx.Link(r,c1);
dlx.Link(r,c2);
dlx.Link(r,c3);
dlx.Link(r,c4);
} /* for(int i=1;i<=81;++i)
for(int j=1;j<=9;++j)
dlx.Link(j+(i-1)*9,i); for(int i=1;i<=81;++i)
for(int j=1;j<=9;++j)
dlx.Link(9*(j-1)+(i-1)%9+1+81*((i-1)/9),i+81); for(int i=1;i<=81;++i)
for(int j=1;j<=9;++j)
dlx.Link((j-1)*81+i,i+162); for(int i=1;i<=3;++i)
for(int j=1;j<=3;++j)
for(int k=1;k<=9;++k)
for(int l=1;l<=3;++l)
for(int m=1;m<=3;++m)
dlx.Link((i-1)*243+(j-1)*27+k+(l-1)*81+(m-1)*9,(i-1)*27+(j-1)*9+k+243); for(int i=0;i<81;++i)
if(s[i]!='.')
{
dlx.ans1[i+1]=s[i]-'0'; dlx.remove(i+1); for(int j=dlx.D[i+1];j!=i+1;j=dlx.D[j])
{
if((dlx.row[j]-1)%9+1==s[i]-'0')
{
for(int k=dlx.R[j];k!=j;k=dlx.R[k])
dlx.remove(dlx.col[k]); break;
}
}
}
*/ dlx.Dance(); int temp=dlx.ansnum; if(temp==)
cout<<"No solution"<<endl;
else if(temp==)
cout<<"Multiple Solutions"<<endl;
else
dlx.showans();
} const int step[][]={{-,},{,},{,},{,-}};
int kcou;
int lu[][][]; void bfs(int num,int x,int y)
{
queue <int> que;
int temp,t1,t2; que.push(x*+y);
map1[x][y]=num; while(!que.empty())
{
temp=que.front();
que.pop(); t1=temp/;
t2=temp%; for(int k=;k<;++k)
if(lu[t1][t2][k] && map1[t1+step[k][]][t2+step[k][]]==-)
{
que.push((t1+step[k][])*+t2+step[k][]);
map1[t1+step[k][]][t2+step[k][]]=num;
}
}
} void getmap()
{
int cou=; for(int i=;i<;++i)
for(int j=;j<;++j)
if(map1[i][j]==-)
bfs(cou++,i,j);
} int main()
{
ios::sync_with_stdio(false); int T,t;
int fang[];
cin>>T; for(int cas=;cas<=T;++cas)
{
memset(map1,-,sizeof(map1));
memset(s,,sizeof(s));
memset(lu,,sizeof(lu));
kcou=; for(int i=;i<;++i)
for(int j=;j<;++j)
{
cin>>t; for(int k=;k<;++k)
if(((t>>(+k))&)==)
lu[i][j][k]=; s[i*+j]=t&;
} getmap(); cout<<"Case "<<cas<<':'<<endl; slove();
} return ;
}
(中等) HDU 4069 Squiggly Sudoku , DLX+精确覆盖。的更多相关文章
- 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 4069 Squiggly Sudoku(DLX)(The 36th ACM/ICPC Asia Regional Fuzhou Site —— Online Contest)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4069 Problem Description Today we play a squiggly sud ...
- [DLX+bfs] hdu 4069 Squiggly Sudoku
题意: 给你9*9的矩阵.对于每一个数字.能减16代表上面有墙,能减32代表以下有墙. .. 最后剩下的数字是0代表这个位置数要求,不是0代表这个数已知了. 然后通过墙会被数字分成9块. 然后做数独, ...
- (简单) POJ 3076 Sudoku , DLX+精确覆盖。
Description A Sudoku grid is a 16x16 grid of cells grouped in sixteen 4x4 squares, where some cells ...
- DLX精确覆盖与重复覆盖模板题
hihoCoder #1317 : 搜索四·跳舞链 原题地址:http://hihocoder.com/problemset/problem/1317 时间限制:10000ms 单点时限:1000ms ...
- 【转】DLX 精确覆盖 重复覆盖
问题描述: 给定一个n*m的矩阵,有些位置为1,有些位置为0.如果G[i][j]==1则说明i行可以覆盖j列. Problem: 1)选定最少的行,使得每列有且仅有一个1. 2)选定最少的行,使得每列 ...
- (简单) HUST 1017 Exact cover , DLX+精确覆盖。
Description There is an N*M matrix with only 0s and 1s, (1 <= N,M <= 1000). An exact cover is ...
随机推荐
- 1.2 Python基本语法
1.交互模式编程 cmd窗口 =>输入 Python => 输入 print "hello,python!"; ps:如果是新版本Python,需要输 ...
- 【stack】模拟网页浏览 poj 1028
#include<stdio.h> #include<string.h> int main() { ][]; ]; int i,depth; strcpy(s[]," ...
- NBUT 1120 线段树
input q n q行 F a b或者Q a b output face left face top face right 可以用map或者线段树做 //map #include<cstdio ...
- python注意事项
以下基于python3.4.3 1.python3与python2不兼容 2.python语言正确的缩进很重要!事实上缩进是种语法 C中需要 { } 的的地方,python使用 : +缩进 实现 3. ...
- jquery 展开关闭效果
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- TCPIP header
tcp packet: tcp header: ip header:
- POJ 1523 SPF (去掉割点能形成联通块的个数)
思路:使用tarjan算法求出割点,在枚举去掉每一个割点所能形成的联通块的个数. 注意:后来我看了下别的代码,发现我的枚举割点的方式是比较蠢的方式,我们完全可以在tarjan过程中把答案求出来,引入一 ...
- ZOJ 2866 Overstaffed Company
树状数组 #include<cstdio> #include<cstring> #include<cmath> #include<algorithm> ...
- asp 正则替换函数
Function RegExpTest(patrn,str1,strng) Dim regEx',str1 ' 建立变量 'str1 = "The quick brown fox jumpe ...
- yii migrate 设计博客
yii migrate/create create_blog_table该命令生成的迁移文件位于 advanced\console\migrations 目录,可能你已经注意到了,yii migrat ...