POJ 3076 Sudoku (dancing links)
题目大意:
16*16的数独。
思路分析:
想说的就是dancing links 的行是依照
第一行第一列填 1
第一行第二列填 2
……
第一行第十五列填15
第一行第二列填 1
……
第二行。。。。
列的纺织则是
第一行放1,第一行放2,。。第十六行放16.。。第一列放1.。第一列放2.。。第十六列放16.。第一块区域放1 。。。。然后在最后81位就是放自己的位置,准确的说就是 r*m+c。
#include <cstdio>
#include <iostream>
#include <algorithm>
#include <cstring>
#define maxn 16*16*16*16*16*4+5
#define inf 0x3f3f3f3f
using namespace std; int n=16*16*9,m=16*16*4,p;
int map[16*16*16+5][16*16*4+5];
int L[maxn],R[maxn],D[maxn],U[maxn],S[maxn],O[maxn],col[maxn],row[maxn],head,cnt;
int num; void dancing_links_init()
{
head=0;
memset(S,0,sizeof S);
for(int i=head;i<=m;i++)
{
R[i]=(i+1)%(m+1);
L[i]=(i-1+m+1)%(m+1);
U[i]=D[i]=i;
}
cnt=m+1;
for(int i=1;i<=n;i++)
{
int rowh=-1;
for(int j=1;j<=m;j++)
{
if(map[i][j])
{
S[j]++;
U[cnt]=U[j];
D[U[j]]=cnt;
U[j]=cnt;
D[cnt]=j;
row[cnt]=i;
col[cnt]=j;
if(rowh==-1)
{
L[cnt]=R[cnt]=cnt;
rowh=cnt;
}
else
{
L[cnt]=L[rowh];
R[L[rowh]]=cnt;
R[cnt]=rowh;
L[rowh]=cnt;
}
cnt++;
}
}
}
}
void Remove(const 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(const int &c)
{
for(int i=U[c];i!=c;i=U[i])
{
for(int j=L[i];j!=i;j=L[j])
{
++S[col[j]];
U[D[j]]=j;
D[U[j]]=j;
}
}
L[R[c]]=c;
R[L[c]]=c;
}
bool dfs(const int &k)//可行解
{
if(head==R[head])
{
sort(O,O+256);
for(int i=0;i<256;i++)
{
printf("%c",O[i]-i*16+'A'-1);
if(i%16==15)puts("");
}
puts("");
return true;
}
int mx=inf,cur=0;
for(int t=R[head];t!=head;t=R[t])
{
if(S[t]<mx)
{
mx=S[t];
cur=t;
}
}
Remove(cur);//依据開始的时候的推断条件,能够知道是一列一列的选择
for(int i=D[cur];i!=cur;i=D[i])//这里就是先选择列
{//然后去选择删除哪一行是覆盖了这列的
O[k]=row[i];
for(int j=R[i];j!=i;j=R[j])
{
Remove(col[j]);
}
if(dfs(k+1))return true;
for(int j=L[i];j!=i;j=L[j])
{
Resume(col[j]);
}
}
Resume(cur);
return false;
}
/*
void dfs(const int &k)//最优解
{
if(R[head]==head)
{
if(k<num)num=k;
return;
}
if(k>=num)return;
int mx=inf,cur=0;
for(int t=R[head];t!=head;t=R[t])
{
if(S[t]<mx)
{
mx=S[t];
cur=t;
}
}
Remove(cur);
for(int i=D[cur];i!=cur;i=D[i])
{
for(int j=R[i];j!=i;j=R[j])
{
Remove(col[j]);
}
dfs(k+1);
for(int j=L[i];j!=i;j=L[j])
{
Resume(col[j]);
}
}
Resume(cur);
}
*/
char tmp[16][1111];
char str[1111];
int main()
{
while(scanf("%s",tmp[0])!=EOF)
{
for(int i=1;i<16;i++)scanf("%s",tmp[i]);
int cnt=0;
for(int i=0;i<16;i++)
for(int j=0;j<16;j++)
str[cnt++]=tmp[i][j]; memset(map,0,sizeof map);
int len=cnt;
for(int i=0;i<len;i++)
{
int r=i/16;
int c=i-r*16;
int base=(r*16+c)*16; if(str[i]=='-')
{
for(int k=1;k<=16;k++)
{
map[base+k][r*16+k]=1;
map[base+k][256+c*16+k]=1;
map[base+k][256+256+16*(4*(r/4)+(c/4))+k]=1;
map[base+k][256*3+r*16+c+1]=1;
}
}
else
{
int k=str[i]-'A'+1;
map[base+k][r*16+k]=1;
map[base+k][256+c*16+k]=1;
map[base+k][256+256+16*(4*(r/4)+(c/4))+k]=1;
map[base+k][256+256+256+r*16+c+1]=1;
}
}
dancing_links_init();
dfs(0);
}
return 0;
}
POJ 3076 Sudoku (dancing links)的更多相关文章
- poj 3074 Sudoku(Dancing Links)
Sudoku Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 8152 Accepted: 2862 Descriptio ...
- POJ3074 Sudoku —— Dancing Links 精确覆盖
题目链接:http://poj.org/problem?id=3074 Sudoku Time Limit: 1000MS Memory Limit: 65536K Total Submissio ...
- (简单) POJ 3076 Sudoku , DLX+精确覆盖。
Description A Sudoku grid is a 16x16 grid of cells grouped in sixteen 4x4 squares, where some cells ...
- POJ 3074 Sudoku (Dacing Links)
推荐一个写数独很好的博客:http://www.cnblogs.com/grenet/p/3163550.html 主要是把九宫格里的元素换到矩阵里面再求解dancing links 网上找的一模版 ...
- POJ 3076 Sudoku DLX精确覆盖
DLX精确覆盖模具称号..... Sudoku Time Limit: 10000MS Memory Limit: 65536K Total Submissions: 4416 Accepte ...
- POJ 3076 Sudoku
3076 思路: dfs + 剪枝 首先,如果这个位置只能填一种字母,那就直接填 其次,如果对于每一种字母,如果某一列或者某一行或者某一块只能填它,那就填它 然后,对于某个位置如果不能填字母了,或者某 ...
- POJ 3076 SUKODU [Dangcing Links DLX精准覆盖]
和3074仅仅有数目的不同,3074是9×9.本来想直接用3074的.然后MLE,,,就差那么20M的空间,,. 从这里学习到了解法: http://www.cnblogs.com/ylfdrib/a ...
- HDU 3111 Sudoku ( Dancing Links 精确覆盖模型 )
推荐两篇学DLX的博文: http://bbs.9ria.com/thread-130295-1-1.html(这篇对DLX的工作过程演示的很详细) http://yzmduncan.iteye.co ...
- 算法实践——舞蹈链(Dancing Links)算法求解数独
在“跳跃的舞者,舞蹈链(Dancing Links)算法——求解精确覆盖问题”一文中介绍了舞蹈链(Dancing Links)算法求解精确覆盖问题. 本文介绍该算法的实际运用,利用舞蹈链(Dancin ...
随机推荐
- 在uboot里面加入环境变量使用run来运行
Author:杨正 Date:2014.11.11 Email:yz2012ww@gmail.com QQ:1209758756 在移植uboot的时候,能够在uboot里面加入定义一些自己的环 ...
- Notepad++中如何设置自动换行以及行宽
view-->word wrap; setting->preference-->vertical edge settings; Notepad++中如何设置自动换行以及行宽 http ...
- BZOJ 1264: [AHOI2006]基因匹配Match( LCS )
序列最大长度2w * 5 = 10w, O(n²)的LCS会T.. LCS 只有当a[i] == b[j]时, 才能更新答案, 我们可以记录n个数在第一个序列中出现的5个位置, 然后从左往右扫第二个序 ...
- POJ 2404 Jogging Trails
Jogging Trails Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 2122 Accepted: 849 Des ...
- POJ 2635 The Embarrassed Cryptographer 高精度
题目地址: http://poj.org/problem?id=2635 题意:给出一个n和L,一直n一定可以分解成两个素数相乘. 让你判断,如果这两个素数都大于等于L,则输出GOOD,否则输出最小的 ...
- 基于Greenplum Hadoop分布式平台的大数据解决方案及商业应用案例剖析
随着云计算.大数据迅速发展,亟需用hadoop解决大数据量高并发访问的瓶颈.谷歌.淘宝.百度.京东等底层都应用hadoop.越来越多的企 业急需引入hadoop技术人才.由于掌握Hadoop技术的开发 ...
- Godiva_百度百科
Godiva_百度百科 北京 三里屯 北京市朝阳区三里屯路19号院10号楼一层S10-13单元及二层S10-22单元 100027 北京朝阳大悦城北京市朝阳区朝阳北路101号朝阳大悦城1号商业楼1F- ...
- 初识Dubbo 系列之4-Dubbo 依赖
依赖 必需依赖 JDK1.5+ 理论上Dubbo能够仅仅依赖JDK,不依赖于不论什么三方库执行,仅仅需配置使用JDK相关实现策略. 缺省依赖 通过mvn dependency:tree > de ...
- Rationnal Rose2003安装并破解
1.安装Rational Rose2003时,在需选择安装项的时候,只选择Rational Rose EnterPrise Edition即可,不需选择其他项,之后选择“DeskTop Install ...
- zabbix 主机名必须要能ping通
api01:/home/tomcat> cat /etc/hosts 127.0.0.1 localhost ::1 localhost localhost.localdomain localh ...