(中等) 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 ...
随机推荐
- 使用内链接(A a inner join B b on a.xx = b.xx)查询2个表中某一列的相同的字段。
这里一句代码就是查询2个表中某一列的相同,可是查询出来之后B表因为有很多重复的id数据,然而查询出来的数据需要插入到临时表中,临时表的oid是不允许有重复的, 因此需要用到 distinct 函数来取 ...
- Linux下的编程实战【转】
一篇比较不错的文章, 降到了 makefile make , gcc编译器,GDB调试器, Linux文件系统,Linux文件API,.C语言库函数(C库函数的文件操作实际上是独立于具体的操作系统平台 ...
- apicloud本地测试安卓测试包安装
1.liutingdeMacBook-Pro:~ js-lt$ which adb 2.liutingdeMacBook-Pro:~ js-lt$ ls 3.liutingdeMacBook-Pro: ...
- ImageLoader的Jar包加载图片
注意:需要添加权限,若缓存图片第二个必须要加 <uses-permission android:name="android.permission.INTERNET" /> ...
- cocos2d-x 3.x 触摸事件
HelloWorldScene.h bool touchBegan(cocos2d::Touch*touch, cocos2d::Event*event);//触摸开始,返回bool类型 void t ...
- nested query for "pat2" table
mysql> select t.appln_id, t.filing_date, t.appln_kind, t.people, GROUP_CONCAT(pu.publn_kind) from ...
- C++Builder 中动态数组的使用(转)
源:http://i.cnblogs.com/EditPosts.aspx?opt=1 和AnsiString类型一样,动态数组是为了和DELPHI中的动态数组相兼容而定义,在BCB中,动态数组是用模 ...
- android脚步---UI界面修改,关于activity中增加按钮和监听
增加按钮和监听,这个和上个不同在于,它不是在一个dialog里面,而是从新写了一个activity,因此需要先找到这个activity的入口. case R.id.checkframe: if (mC ...
- 关于UIView及其子类重绘drawRect
转载自:https://nezha.gitbooks.io/ios-developmentarticles/content/UIView%E7%9A%84drawRect%E9%87%8D%E7%BB ...
- VIEWCONTROLLER的启动流程
转载自:http://sunnyyoung.net/post/ios/2015-04-22-viewcontrollerde-qi-dong-liu-cheng-yu-jie-xi VIEWCONTR ...