DLX算法及应用(三)杀手数独
(马上就要开学了,抽空把这个坑填上。。。。。。)
先来介绍下什么是杀手数独
如图所示(来源:百度百科),杀手数独就是在经典数独的基础上,又多加了一组限制条件:每一个虚线框称作一个区,要求区内的数字不能重复,且区内数字总和等于该区左上角的数字。
杀手数独起始是没有一个数字的,挺难的= =
好像在哪里看到这样一个提问:杀手数独为什么叫杀手数独?---因为是时间的杀手。。。。。= =
想体验的可以去欧泊颗(http://www.oubk.com/)感受一下。
正好之前在研究DLX算法,就想试试能不能将杀手数独转换为一个精确覆盖问题,网上搜了好久也没有发现相关的资源,估计没人这么无聊吧= =,那我就自己试着构造一下吧。
以下正文:
首先来回顾一下经典数独是怎么转换成一个324列的精确覆盖问题的,见《DLX算法及应用(一)DLX模板+解数独》(http://blog.csdn.net/bl0ss0m/article/details/17918705)
那么杀手数独就是在经典数独的4个限制条件基础上,新增了一条:
虚线框内数字不重复且和为给出的数字
那么我们就再新增405列(因为81个格子总和为405),其中将405列分成若干组,每一组就代表了一个虚线框,每一组的列数就为对应虚线框中数字之和
让我们单独拿出一个虚线框来考虑:
对于一个包含了{a1,a2,...,an}n个格子和为Sn的虚线框,我们令
Sn = a1+a2+...+an (1 ≤ a1 < a2 < ... < an ≤ 9)
这样a1最小为max{1, Sn-(n-1)(20-n)/2},最大为[Sn/n - (n-1)/2]下取整
假设其包含了3个格子,和为20,那么它就对应了20列
可能的情况就为
3+8+9
4+7+9
5+6+9
5+7+8
这样,任意一个格子都可能是{3,4,5,6,7,8,9}中的一个
但如果第一个格子为3,剩下2个格子就只可能为8、9
如果第一个格子为4,剩下2个格子就只可能为7、9
.....
如何用01矩阵表达这种关系呢?
再观察下上面的4种情况,发现3、4、5只可能出现在最开始的位置,6只可能跟在5的后面,7可以跟在4或5的后面,8可以跟在3的后面,也可在最后,9只可能在最后
也就是说有1种3、4、5、6、9,2种7、8,也就是说一个格子可能为上述9种可能中的一种,那我们这样构造:
第一个格子可能为3,前324列和经典数独的构造方式一样,在该虚线框对应的列组中,前3列为1
可能为4,前4列为1
可能为5,前5列为1
可能为6,第6~11列为1
可能为7(1),第5~11列为1
可能为7(2),第6~12列为1
可能为8(1),第4~11列为1
可能为8(2),第13~20列为1
可能为9,第12~20列为1
剩下的2个格子同样如此
再举个直观的例子:5 = 1+4、2+3,构造的矩阵如下
... 0 ... 1 ... 1 0 0 0 0 ...
... 0 ... 1 ... 1 1 0 0 0 ...
... 0 ... 1 ... 0 0 1 1 1 ...
... 0 ... 1 ... 0 1 1 1 1 ...
... 1 ... 0 ... 1 0 0 0 0 ...
... 1 ... 0 ... 1 1 0 0 0 ...
... 1 ... 0 ... 0 0 1 1 1 ...
... 1 ... 0 ... 0 1 1 1 1 ...
前2个01列是前324列(其实是前81列)中的2列,用来确定位置,后面5列表示该虚线框
如果先选择了第1行,那么根据位置信息,就会排除掉2~4行,再根据虚线框的信息,排除掉5、6行,第7行无法完全覆盖,所以选择第8行,即1+4
这样就可以构造出一个若干行,324+405列的01矩阵,再套用我们之前写好的DLX模板,就可以快速的解决杀手数独问题了!!
代码什么的麻烦各位去下一下,所需积分0,给我加点资源分吧^_^
下载地址:
杀手数独例题及程序:
http://download.csdn.net/detail/u012453913/6924545
源代码:
http://download.csdn.net/detail/u012453913/6925003
DLX算法及应用(三)杀手数独相关推荐
- 数独问题——DLX算法
题目传送门 题目大意: 求解一个数独. 题解 如果还没有看过DLX算法请点这里. 回想一下精确覆盖问题,它的要求是每一列恰好有一个1,那么我们可以考虑将每一列作为一个限制条件,那么将数独的限制条件套进 ...
- 舞蹈链算法(DLX 算法)略解
Another Blog DLX=Dancing Line X 之前学 DLX 时在网上看了好几篇博客,结合着几篇讲代码的.有图片的.说原理的,总算弄懂了.这里 DLX 是用来解决精确覆盖问题的算法, ...
- 四宫杀手数独题目_四个启动工程杀手
四宫杀手数独题目 在您的早期软件启动时要提防这些工程错误 在 2016年,我为首次创业的人提供了技术建议,他们建立了种子资金的食品外卖市场. 我认为,公司做出的每项技术选择都是错误的. CEO相信&q ...
- 链表上的舞者——舞蹈链(DLX算法)
在整个求解过程中,指针在数据间跳跃着,就像精巧设计的舞蹈一样,故Donald E.Knuth把它称为Dancing Links(中文译名舞蹈链). 目录 第一部分:DLX算法的提出 1.1一类被称为精 ...
- STL中算法锦集(三)
STL中算法锦集(三) 文章目录 STL中算法锦集(三) 一.< algorithm > 1.std::find_if 2.std::find_if_not 3.std::for_each ...
- 给出TREE_INSERT过程的非递归版本(算法导论第三版12.3-1)
给出TREE_INSERT过程的非递归版本(算法导论第三版12.3-1) template<typename T> void insert_recursive(BinaryTree< ...
- 写出TREE-PREDECESSOR的伪代码(算法导论第三版12.2-3)
写出TREE-PREDECESSOR的伪代码(算法导论第三版12.2-3) TREE-PREDECESSOR(x)if x.left != NILreturn TREE-MAXIMUM(x.left) ...
- 写出TREE-MINIMUM 和TREE-MAXIMUM的递归版本(算法导论第三版12.2-2)
写出TREE-MINIMUM 和TREE-MAXIMUM的递归版本(算法导论第三版12.2-2) template<typename T> BinaryTreeNode<T>* ...
- 二叉树的中序遍历非递归方法(算法导论第三版12.1-3)
二叉树的中序遍历非递归方法(算法导论第三版12.1-3) 1⃣️用栈实现 template<typename T> void inorder_tree_walk_non_recursion ...
最新文章
- Axure 全局辅助线(转)
- <文献阅读>用转移熵通过微阵列的时间序列推断基因调控网络(inferring gene regulatory networks from microarray time series data
- ATP检查的一些TIPS
- C++多态面试题汇总
- Apache Shiro<=1.2.4反序列化RCE漏洞
- 用户列表 java_三个jsp页面+Java片段实现的用户登录和用户列表查询[带分页]
- python中的numpy库有什么优缺点_Python中Numpy库的基础知识点
- CSDN、sina博客在Zoundry中登记的API URL 收藏
- CNN卷积神经网络原理讲解+图片识别应用(附源码)
- PMP-变更控制流程图详解
- 用户旅程图进阶:实操与模板
- Java查询返回值为树形结构
- Mindjet MindManager思维导图空间快捷键
- Java 文件压缩及下载
- 内网安全-arp欺骗,dns劫持钓鱼
- 向量召回在躺平APP的实践
- 05 -数据分析与SQL- Lesson5 SQL数据清理
- 2020联发科技笔试面试经验
- python读音有道-Python 20行简单实现有道在线翻译的详解
- 将时分秒的时间转为2020-11-12T20:00:00.000+08:00格式