Description

  Today we play a squiggly sudoku, The objective is to fill a 9*9 grid with digits so that each column, each row, and each of the nine Connecting-sub-grids that compose the grid contains all of the digits from 1 to 9. 
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.
 
  还是数独问题,其实和前面的没有什么两样,然后对于每个奇形怪状的9格子,我是用BFS来构造的。。。。。。
 
代码如下:
#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+精确覆盖。的更多相关文章

  1. POJ 3076 Sudoku DLX精确覆盖

    DLX精确覆盖模具称号..... Sudoku Time Limit: 10000MS   Memory Limit: 65536K Total Submissions: 4416   Accepte ...

  2. (简单) POJ 3074 Sudoku, DLX+精确覆盖。

    Description In the game of Sudoku, you are given a large 9 × 9 grid divided into smaller 3 × 3 subgr ...

  3. POJ 3074 Sudoku DLX精确覆盖

    DLX精确覆盖.....模版题 Sudoku Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 8336   Accepted: ...

  4. 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 ...

  5. [DLX+bfs] hdu 4069 Squiggly Sudoku

    题意: 给你9*9的矩阵.对于每一个数字.能减16代表上面有墙,能减32代表以下有墙. .. 最后剩下的数字是0代表这个位置数要求,不是0代表这个数已知了. 然后通过墙会被数字分成9块. 然后做数独, ...

  6. (简单) POJ 3076 Sudoku , DLX+精确覆盖。

    Description A Sudoku grid is a 16x16 grid of cells grouped in sixteen 4x4 squares, where some cells ...

  7. DLX精确覆盖与重复覆盖模板题

    hihoCoder #1317 : 搜索四·跳舞链 原题地址:http://hihocoder.com/problemset/problem/1317 时间限制:10000ms 单点时限:1000ms ...

  8. 【转】DLX 精确覆盖 重复覆盖

    问题描述: 给定一个n*m的矩阵,有些位置为1,有些位置为0.如果G[i][j]==1则说明i行可以覆盖j列. Problem: 1)选定最少的行,使得每列有且仅有一个1. 2)选定最少的行,使得每列 ...

  9. (简单) 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. 1.2 Python基本语法

    1.交互模式编程 cmd窗口   =>输入 Python => 输入 print "hello,python!";        ps:如果是新版本Python,需要输 ...

  2. CSS样式 初学

    CSS样式 参考网站: CSS用法:3种 一:直接样式表 如<p style="color:red;">这是一个段落</p> 二:内部样式表 如:<s ...

  3. zzuli 1907: 小火山的宝藏收益 邻接表+DFS

    Time Limit: 1 Sec  Memory Limit: 128 MBSubmit: 113  Solved: 24 SubmitStatusWeb Board Description    ...

  4. linux 下载安装tomcat

    1.下载tomcat 2.tar -zxvf apache-tomcat-7.0.67.tar.gz 3.cd bin目录  启动  ./startup.sh [root@fuyuanming bin ...

  5. tiny210V2 Uboot kernel filesystem 烧写和启动

    1.sd启动 将u-boot镜像写入SD卡 将SD卡通过读卡器接上电脑(或直接插入笔记本卡槽),通过"cat /proc/partitions"找出SD卡对应的设备,我的设备节点是 ...

  6. [转]ubuntu的which、whereis、locate和find命令

     which 只能寻找执行文件 ,并在PATH变量里面寻找. whereis 从linux文件数据库(/var/lib/slocate/slocate.db)寻找,所以有可能找到刚刚删除,或者没有发现 ...

  7. UVALive 4031 Integer Transmission(贪心 + DP)

    分析:求出最大值和最小值比较简单,使用贪心法,求最小值的时候我们让所有的0尽可能的向后延迟就可以了,求最大值则相反. 关键在于求出可以组合出的数字个数. 这就是组合数学版的dp了,我们让dp[i][j ...

  8. Linux学习 -- 系统管理

    1 进程管理 判断服务器健康状态 top [选项] 查看系统中所有进程 ps aux      BSD格式 ps -le        Linux格式 pstree [选项] -p   显示PID - ...

  9. Html基础详解之(jquery)

    jquery选择器: #id 根据给定的ID匹配一个元素,如果选择器中包含特殊字符,可以用两个斜杠转义.(注:查找 ID 为"myDiv"的元素.) <!DOCTYPE ht ...

  10. Bootstrap 模态对话框只加载一次 remote 数据的解决办法 转载

    http://my.oschina.net/qczhang/blog/190215 摘要 前端框架 Bootstrap 的模态对话框,可以使用 remote 选项指定一个 URL,这样对话框在第一次弹 ...