LINK:数独

这道题好难 比DXL模板题要难上不少.

首先 还是考虑将行当做决策 那么 一共有\(9*9*9=729\) 个决策.

考虑列用来填充 需要有的条件为 某个位置能能放一次\(9*9\) 某行放一个x 某列放一个x 某九宫放一个.

那么列数为\(4*9*9=324\)。

考虑1的个数 每一行都有这4种形式 所以一共存在\(4*9*9*9=2916\)个1.

图非常容易建出来 注意答案的输出。(每一次写都相当于学了一遍 什么时候才能学会呢

const int MAXN=3510,maxn=10;
int W=9,n,m,cnt;
int a[maxn][maxn],b[maxn][maxn];
int l[MAXN],r[MAXN],col[MAXN],row[MAXN],u[MAXN],d[MAXN],h[MAXN],s[MAXN],ans[MAXN];
inline void prepare()
{
rep(0,m,i)
{
l[i]=i-1;
r[i]=i+1;
u[i]=d[i]=i;
}
r[m]=0;l[0]=m;
memset(h,-1,sizeof(h));
cnt=m;
}
inline void Link(int x,int y)
{
++s[y];
row[++cnt]=x;col[cnt]=y; u[cnt]=y;d[cnt]=d[y];
u[d[y]]=cnt;d[y]=cnt;
if(h[x]==-1)h[x]=r[cnt]=l[cnt]=cnt;
else
{
r[cnt]=h[x];
l[cnt]=l[h[x]];
r[l[h[x]]]=cnt;
l[h[x]]=cnt;
}
}
inline void remove(int y)
{
r[l[y]]=r[y];l[r[y]]=l[y];
for(int i=d[y];i!=y;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]];
}
}
}
inline void resume(int y)
{
for(int i=u[y];i!=y;i=u[i])
{
for(int j=l[i];j!=i;j=l[j])
{
u[d[j]]=j;
d[u[j]]=j;
++s[col[j]];
}
}
r[l[y]]=y;l[r[y]]=y;
}
inline void dance(int dep)
{
if(!r[0])
{
rep(1,dep-1,i)
{
int cc=(ans[i]-1)%9+1;
int y=(ans[i]-1)/9%9+1;
int x=(ans[i]-1)/9/9+1;
b[x][y]=cc;
}
rep(1,W,i)
{
rep(1,W,j)put_(b[i][j]);
puts("");
}
exit(0);
}
int y=r[0];
for(int i=r[0];i;i=r[i])if(s[i]<s[y])y=i;
remove(y);
for(int i=d[y];i!=y;i=d[i])
{
ans[dep]=row[i];
for(int j=r[i];j!=i;j=r[j])remove(col[j]);
dance(dep+1);
for(int j=l[i];j!=i;j=l[j])resume(col[j]);
}
resume(y);
}
int main()
{
freopen("1.in","r",stdin);
m=324;n=729;prepare();
rep(1,W,i)rep(1,W,j)
{
get(a[i][j]);
rep(1,W,k)
{
if(a[i][j]&&a[i][j]!=k)continue;
int id=(W*(i-1)+(j-1))*W+k;
int w1=(j-1)*W+k;//某一列要有k.
int w2=W*W+(i-1)*W+k;//某一行要有k.
int w3=W*W*2+(i-1)*W+j;//某个位置只能放一次.
int w4=W*W*3+((i-1)/3*3+(j-1)/3)*9+k;
Link(id,w1);Link(id,w2);Link(id,w3);Link(id,w4);
}
}
dance(1);return 0;
}

luogu P1784 数独 dfs 舞蹈链 DXL的更多相关文章

  1. 洛谷 P1784 数独[DFS/回溯]

    To 洛谷.1784 数独类似题:CODEVS.4966 简单数独(4*4数独) CODEVS.2924 数独挑战) 题目描述 数独是根据9×9盘面上的已知数字,推理出所有剩余空格的数字,并满足每一行 ...

  2. 算法实践——舞蹈链(Dancing Links)算法求解数独

    在“跳跃的舞者,舞蹈链(Dancing Links)算法——求解精确覆盖问题”一文中介绍了舞蹈链(Dancing Links)算法求解精确覆盖问题. 本文介绍该算法的实际运用,利用舞蹈链(Dancin ...

  3. 转载 - 算法实践——舞蹈链(Dancing Links)算法求解数独

    出处:http://www.cnblogs.com/grenet/p/3163550.html 在“跳跃的舞者,舞蹈链(Dancing Links)算法——求解精确覆盖问题”一文中介绍了舞蹈链(Dan ...

  4. luogu P4929 【模板】舞蹈链 DLX

    LINK:舞蹈链 具体复杂度我也不知道 但是 搜索速度极快. 原因大概是因为 每次检索的时间少 有一定的剪枝. 花了2h大概了解了这个东西 吐槽一下题解根本看不懂 只能理解大概的想法 核心的链表不太懂 ...

  5. HDU 1426(数独 DFS)

    题意是完成数独. 记录全图,将待填位置处填 0,记录下所有的待填位置,初始化结束.在每个待填位置处尝试填入 1 - 9,若经过判断后该位置可以填入某数字,则继续向下填下一个位置, 回溯时把待填位置重新 ...

  6. 舞蹈链 DLX

    欢迎访问——该文出处-博客园-zhouzhendong 去博客园看该文章--传送门 舞蹈链是一个非常玄学的东西…… 问题模型 精确覆盖问题:在一个01矩阵中,是否可以选出一些行的集合,使得在这些行的集 ...

  7. poj 1084 舞蹈链(纠结题)

    此题反正我自己是认为poj给的数据范围是有错的,不知道是不是自己太弱了,有大神在的话,欢迎来呸! 其实目的就在于建图,搞的我后来建了一个无比纠结的图,先建立了火柴棍和正方形的一个全图,然后再删除一些火 ...

  8. 舞蹈链(DLX)

    舞蹈链(DLX) Tags:搜索 作业部落 评论地址 一.概述 特别特别感谢这位童鞋His blog 舞蹈链是一种优美的搜索,就像下面这样跳舞- 舞蹈链用于解决精确覆盖或者重复覆盖的问题 你可以想象成 ...

  9. Dancing Links算法(舞蹈链)

    原文链接:跳跃的舞者,舞蹈链(Dancing Links)算法——求解精确覆盖问题 作者:万仓一黍 出处:http://grenet.cnblogs.com/ 本文版权归作者和博客园共有,欢迎转载,但 ...

随机推荐

  1. 洛谷P3237 米特运输

    题目链接 题意: 中文题,挺好理解.就是让节点的权值等于各子节点权值之和,然后每个子节点的权值相等,原本每个点有一个权值,通过最少次的修改(可以修改成小数)使其满足要求. 分析: 题意一旦读明白,题什 ...

  2. appium升级操作

    在app自动化测试中经常会碰到,因为appium版本低而导致,appium客户端连接不到appium服务端等一系列错误~ 其实appium升级很简单的哦~ 打开cmd命令行终端,键入npm updat ...

  3. Howdoo中文社区AMA总结(10月21日)

    10月21日Howdoo举办了中文社区的首次AMA活动,CEO -David Brierley和CMO -Jason Sibley加入到社群中与大家交流并回答社区成员的相关问题. 以下是精选的问题总结 ...

  4. Halcon采集图像Image Acquisition解析

    很明显,图像的采集是所有机器视觉应用中必须解决的问题,HALCON提供了为各种图像采集设备执行这种交互的接口,图像采集的任务被简化为几行代码,只需几个操作符的调用,更重要的是,这种简单并不是以限制可用 ...

  5. day18 作业

    目录 1.编写课上讲解的有参装饰器准备明天默写 2.在文件开头声明一个空字典,然后在每个函数前加上装饰器,完成自动添加到字典的操作 3.编写日志装饰器,实现功能如:一旦函数f1执行,则将消息2017- ...

  6. JS基础知识点(一)

    原始类型 null undefined boolean number string symbol 注意 原始类型存储的都是值,是没有函数可以调用的,但实际上除null和undefined外,其他类型使 ...

  7. web 部署专题(三):压力测试(一)工具 siege

    1.介绍 Siege是一个压力测试和评测工具,设计用于WEB开发这评估应用在压力下的承受能力:可以根据配置对一个WEB站点进行多用户的并发访问,记录每个用户所有请求过程的相应时间,并在一定数量的并发访 ...

  8. mongodb(五):聚合操作(python)

    pymongo的聚合操作 数据类型样式 /* 1 */ { "_id" : ObjectId("5e5a32fe2a89d7c2fc05b9fc"), &quo ...

  9. Django框架02 /Django下载安装、url路由分发

    Django框架02 /Django下载安装.url路由分发 目录 Django框架02 /Django下载安装.url路由分发 1. django下载安装 2. pycharm创建项目 3. 基于D ...

  10. Knn和K-means

    先开个标题,以后慢慢填充. k近邻算法(knn)属于监督学习 一. 三个关键点:1.k的取值,当k值较小时,选取点较少,相当于会有在较小的范围内进行学习预测,学习误差会减小,但是估计误差会增大,因为训 ...