`
evasiu
  • 浏览: 169841 次
  • 性别: Icon_minigender_2
  • 来自: 广州
博客专栏
Fa47b089-e026-399c-b770-017349f619d5
TCP/IP详解卷一>阅读...
浏览量:12567
社区版块
存档分类
最新评论

总共有多少个数独?

 
阅读更多
憋屈地看了一个星期的论文,实在是没一点意思。为了娱乐一下自己,兼受同学启发,我决定用python写一个数独游戏。从大二开始装了个ubuntu系统后,就发现了这个有趣的游戏。之后每次进入这个系统,非得先来几局数独;再到后来,为了玩数独,特意进了这个系统。喜欢这个自带的游戏的特点,界面简单,只做必要的错误提示,可以回溯,是我用过的最理想的数独游戏了,呵呵。至于我自己打算做一个数独游戏,纯粹是为了现学现用。自从开始学python以来,从来没有真正用它写过一段带有自己设计思想的代码,实是不该。何不就为自己做一个windows下也能玩的称心如意的数独呢?好了,取名就叫Eva's Sudoku~!不过话说回来,这篇文章的主题是:总共有多少个数独
这绝对不是一个简单的排列组合问题。关于这个问题,《编程之美》有过一个简单的推断介绍。根据里面找提供的一个网址,我找到了关于这个问题的详细解决方案[1]。现在让我们先做一些简单的规定:
1. 我们要求的是合法的数独总数,定为N
2. 对于数独中的9个块(block),分别命名如下:



3. 对于一个块(block),如果其内9个数字按如下方式排序,则称其为“标准型”:



总是可以通过替换使得一个块成为标准型的,这个过程叫做relabeling。这样的话,我们可以总是通过relabeling使B1成为标准型,对于一个B1是标准型的合法数独,它将可以通过relabeling得到9!个不一样的数独,因此,现在我们要求解的问题变成:
B1是标准型的合法数独有多少个?设该数为N1,我们有N=N1*9!。
好了,现在B1确定下来了,为了使数独合法,B2-B3总共有多少种可能呢?首先考虑B2的第一行,填写它的数字要么全部来自B1的第二行或第三行,要么是B1第二、三行的混合。B2-B3第一行的所有可能如下:



如果填写B2第一行的数字全部来自B1的第二行或第三行(我们称其为pure的情况),合法的B2-B3的填法如下(图为填写B2第一行的数字全部来字B1的第二行):



每行内部都可以全排,因此总共有(3!)^6种可能,再加上填写B2第一行的数字全部来自B1第三行的情况,对于pure的情况,总共有2*(3!)^6种可能。
如果填写B2第一行的数字是B1第二、第三行的混合(总共有18种组合方式),列取其中一种来看(其中a,b,c各代表1,2,3中的某个数),在这种情况下,包括全排列,总共会有3*(3!)^6种排列情况:



因此,B2-B3的合法可能共有:
M1=2*(3!)^6+18*3*(3!)^6=56*(3!)^6=2612736

为了让问题快速得到一个接近的解,我们使用探索法来进一步分析:
我们从九宫格的每一个块出发,如果每个块都由1~9填充,不再有其他限制,则合法的解共有N0=(9!)^9;进一步加上限制,块行中每一行都由1~9填充,其合法的解共有M2=9!*M1,九宫格里共有3个块行,因此使三个块行都合法的解共有M=M2^3,满足块行限制的解的个数在满足块限制解的个数中所占的比例为k=M/N0,同理满足块列限制的解的个数在满足块限制解的个数中所占的比例也为k。假设以上两个比例相互独立(事实上它们并不完全独立),则同时满足块行解和块列解在满足块限制解中的比较约为k^2,因此同时满足块行列限制的解(即九宫格的解)的总数约为N0*k^2~6.657*10^21。该估计结果与精确结果6.671*10^21相差大约0.2%。

现在让我们进入精确结果的求解过程:
总的来说,求解的思路是暴力求解。设置两个loop循环,外循环穷举所有在B1为标准型的情况下B2-B3所有可能的解,内循环则在B2-B3的解的情况下穷举所有合法的数独的解。

1. 外循环
现在我们知道了B2-B3所有可能的解的个数了(M1=2612736),外循环将执行200多万次!这一想就让人觉得遥遥无期,有什么办法能够减少穷举的次数呢?选代表~!我们总是能够通过行列变换、交换元素等方法来使一个数独转变成另外一个数独,这样的话,当我们知道了第一个数独的解法,我们自然而然就知道了第二个数独的解法,第二个数独将与第一个数独有同样的解法个数(不知道你明白我的意思了没?)由此我们可能在所有B2-B3可能的解(M1=2612736种)的集合中定义等价关系,从而使等价集中的待完成的数独具有相等个数的解。
怎么从一个数独转换成另一个数独呢?前面我们使用了relabeling技术,但事实上除了这个以外,还有其他技术,如块交换,例如我们交换B2跟B3,相应的解只需要交换B5跟B6,B8跟B9,完成B2-B3的解的个数将与完成B3-B2的解的个数相等。我们还可以对B1、B2、B3进行全排,下面的B4~B9只需做相应的顺序调整。虽然这将使B1不再是标准型的,但是别忘了我们还可以通过relabeling技术使它成为标准型的。甚至我们还可以对块的列、行进行全排。这些技术将帮助我们选举出一些特定的代表来进入内循环,内循环算出的该代表的个数乘以该代表所在集合的个数,将是该集合的合法的数独解的个数。我决定用数学公式来表达这些绕口的事情:



现在我们的目标就是减少这个外循环的次数k。上面的分析我们知道,对B2、B3内的列进行全排列得到的解属于一个集合,对B2、B3进行交换得到的解也属于一个集合。因此我们选取的代表具有如下特点:
1. B2,B3的第一行是增序的;
2. B2的第一行的第一个数字小于B3第一行的第一个数字。
每个代表都存在2*(3!)^2种原始序列通过转换(lexicographical reduction)变成该代表,也就是说,解决了一个代表的解的个数,我们实际上解决了72种情况下的解的个数,现在我们把外循环k由2612736降到了36288(=2612736/72)。
上面的做法事实上并没有完全地利用全排列与relabeling技术。对于这36288种可能,我们可以对B1-B2-B3进行全排列,也可以对每个块中的三个列进行全排列,从而可以得到6^4=1296种不同的解,然后对B1进行relabeling,再对B2-B3进行lexicographical reduction从而使其成为一个代表,这将使原先的36288个代表进一步降到只剩下2051个代表(具体得出的结果是通过程序完成的);更进一步,可以对B1-B2-B3的行进行全排列,然后再将B1进行relabeling变换得到一个新的可能,最终,可以得到416个代表。
有时候交换特定元素并不改变数独其他元素的解,例如下面块行,完成他们的解的个数的相同的(因此它们也是等价的):







除了列6跟列9的元素对(8,9)之外,列4、7的(1,2)、列1、4的(1,4)、列2、9的(5,8)以及列3、6的(6,9)之间的交换也能达到同样的效果。
更近一步,除了一对一的交换,还有2对2的交换等等,如下图:





通过消除这些等价关系,最终我们只剩下了71个代表。通过解答这71个代表,最终发现其实只有44种完全不同的代表。也就是说,最终我们可以将外循环降到k=44。

2. 内循环
内循环的工作就是针对B1-B2-B3的44种代表中的每一个,穷举所有合法的完整数独,然后根据我们上面提供的公式,即可求出N1进而求出N。但是我们精益求精,对B2-B3的进行选举代表的办法也同样可以运用到B4、B7上,当然,由于它受到更多的限制,我们只限制B4、B7的第一列是递增的,这样我们可以通过行的全排列来求出其他的数独,这样的做法使内循环的速度提升了72倍。

通过对这44种代表的穷举,我们最终将得到N1=18383222420692992,进一步得到N=N1*9!=6670903752021072936960 ~ 6.671*10^21。

------------------------
[1]http://www.afjarvis.staff.shef.ac.uk/sudoku/
  • 大小: 27.8 KB
  • 大小: 43.7 KB
  • 大小: 15.6 KB
  • 大小: 15.3 KB
  • 大小: 7.4 KB
  • 大小: 13 KB
  • 大小: 14.3 KB
  • 大小: 14.4 KB
  • 大小: 17.2 KB
  • 大小: 16.9 KB
  • 大小: 5.5 KB
0
0
分享到:
评论

相关推荐

    多智能体一致性仿真 简单的多智能体一致性性仿真图,包含状态轨迹图和控制输入图 程序简单,所以便宜,但是有注释,都能看懂,适合初学者

    多智能体一致性仿真 简单的多智能体一致性性仿真图,包含状态轨迹图和控制输入图。 程序简单,所以便宜,但是有注释,都能看懂,适合初学者。

    小程序项目-基于微信小程序的微信小程序租房平台(包括源码,数据库,教程).zip

    Java小程序项目源码,该项目包含完整的前后端代码、数据库脚本和相关工具,简单部署即可运行。功能完善、界面美观、操作简单,具有很高的实际应用价值,非常适合作为Java毕业设计或Java课程设计使用。 所有项目均经过严格调试,确保可运行!下载后即可快速部署和使用。 1 适用场景: 毕业设计 期末大作业 课程设计 2 项目特点: 代码完整:详细代码注释,适合新手学习和使用 功能强大:涵盖常见的核心功能,满足大部分课程设计需求 部署简单:有基础的人,只需按照教程操作,轻松完成本地或服务器部署 高质量代码:经过严格测试,确保无错误,稳定运行 3 技术栈和工具 前端:小程序 后端框架:SSM/SpringBoot 开发环境:IntelliJ IDEA 数据库:MySQL(建议使用 5.7 版本,更稳定) 数据库可视化工具:Navicat 部署环境:Tomcat(推荐 7.x 或 8.x 版本),Maven

    模糊PID控制器的C语言实现.zip

    模糊PID控制器的C语言实现

    电子科技大学图书馆微信小程序_中国电子科技大学.zip

    电子科技大学图书馆微信小程序_中国电子科技大学

    武汉市新版劳动合同.doc

    武汉市新版劳动合同

    用于微信小程序的ProtoBuffer库.zip

    用于微信小程序的ProtoBuffer库

    WINCC 用VBS写MYSQL动作说明

    WINCC 用VBS写MYSQL动作说明

    039智能微电网PSO优化算法,比较全,推荐下载。matlab代码.rar

    1.版本:matlab2014/2019a/2024a 2.附赠案例数据可直接运行matlab程序。 3.代码特点:参数化编程、参数可方便更改、代码编程思路清晰、注释明细。 4.适用对象:计算机,电子信息工程、数学等专业的大学生课程设计、期末大作业和毕业设计。

    Stentiford 细化算法Matlab代码.rar

    1.版本:matlab2014/2019a/2024a 2.附赠案例数据可直接运行matlab程序。 3.代码特点:参数化编程、参数可方便更改、代码编程思路清晰、注释明细。 4.适用对象:计算机,电子信息工程、数学等专业的大学生课程设计、期末大作业和毕业设计。

    含高比例分布式光伏的配电网集群电压协调控制 摘要:代码主要做的是基于网络划分的双层电压控制策略,通过优化光伏变流器的有功和无功输出功率实现光伏发电损失和线路有功损耗最小,在集群划分基础上,研究包含群内

    含高比例分布式光伏的配电网集群电压协调控制 摘要:代码主要做的是基于网络划分的双层电压控制策略,通过优化光伏变流器的有功和无功输出功率实现光伏发电损失和线路有功损耗最小,在集群划分基础上,研究包含群内自治优化和群间分布式协调的双层电压控制策略,集群自治优化控制通过交替更新群内最优解和平衡节点电压实现群内电压的实时快速控制。 长时间尺度的群间分布式协调控制基于交方向乘子法,通过相邻集群的有限边界数据交实现对分布式光伏输出功率的全局优化控制。 复现结果非常良好,结果图展示如下:

    springboot170图书电子商务网站的设计与实现.zip

    springboot170图书电子商务网站的设计与实现,含有完整的源码和报告文档

    客车驾驶员劳动合同.doc

    客车驾驶员劳动合同

    Bernsen 阈值方法的实现。.rar

    1.版本:matlab2014/2019a/2024a 2.附赠案例数据可直接运行matlab程序。 3.代码特点:参数化编程、参数可方便更改、代码编程思路清晰、注释明细。 4.适用对象:计算机,电子信息工程、数学等专业的大学生课程设计、期末大作业和毕业设计。

    springboot164党员教育和管理系统.zip

    springboot164党员教育和管理系统,含有完整的源码和报告文档

    小区团购-JAVA-基于springboot小区团购管理设计与实现(毕业论文)

    以下是小区团购系统的功能描述,旨在为小区居民提供便捷的团购服务,以便于集中采购、节省开支和提高生活质量。 小区团购系统功能描述 1. 用户角色 管理员 商家 居民 2. 功能描述 管理员功能 用户管理 管理居民和商家的注册、审核、修改和删除。 设置不同用户的权限,确保系统安全性。 团购管理 创建、编辑和删除团购活动,包括商品信息、价格、起订量及截止时间。 审核商家提交的团购活动,确保商品质量和服务可靠性。 订单管理 监控所有团购订单的状态,包括未支付、已支付、配送中和完成等。 支持订单查询、修改和取消处理。 数据统计与分析 生成团购活动的销售报表和参与情况统计,帮助评估活动效果。 分析用户购买行为,以优化后续团购活动。 优惠活动管理 设置和管理促销活动(如满减、折扣、买赠等),吸引更多居民参与团购。 跟踪活动效果,调整策略以提升销售额。 商家功能 商家注册与管理 注册并创建商家账户,填写基本信息(如店铺名称、联系方式、地址等)。 提交商品信息,设置价格和库存,管理团购活动。 团购活动发布 创建新的团购活动,上传商品图片,详细描述和定价。 设置活动开始和结束时间,定义团购

    Multisim仿真TL494BUCK闭环,稳定输出5v,带软启动 电流限制为0.14A电流超过限制电压下降,为电流保护 软启动由4脚控制,示波器可看到输出 需要用Multisim14才能打开

    Multisim仿真TL494BUCK闭环,稳定输出5v,带软启动。 电流限制为0.14A电流超过限制电压下降,为电流保护。 软启动由4脚控制,示波器可看到输出。 需要用Multisim14才能打开。

    【热力学】基于matlab烤箱中烤面包的非稳态传热过程仿真【含Matlab源码 10961期】.zip

    Matlab领域上传的视频是由对应的完整代码运行得来的,完整代码皆可运行,亲测可用,适合小白; 1、从视频里可见完整代码的内容 主函数:main.m; 调用函数:其他m文件;无需运行 运行结果效果图; 2、代码运行版本 Matlab 2019b;若运行有误,根据提示修改;若不会,私信博主; 3、运行操作步骤 步骤一:将所有文件放到Matlab的当前文件夹中; 步骤二:双击打开main.m文件; 步骤三:点击运行,等程序运行完得到结果; 4、仿真咨询 如需其他服务,可私信博主; 4.1 博客或资源的完整代码提供 4.2 期刊或参考文献复现 4.3 Matlab程序定制 4.4 科研合作

    springboot161基于springboot的公交线路查询系统.zip

    springboot161基于springboot的公交线路查询系统,含有完整的源码和报告文档

    微信小程序云增强SDK_xpmjs.zip

    微信小程序云增强SDK_xpmjs

    matlab实现飞翼无人机鲁棒控制-飞翼无人机-鲁棒控制-matlab

    内容概要:本文详细介绍了飞翼无人机的鲁棒控制原理及其在Matlab中的实现方法。飞翼无人机因构型特殊而面临诸多不确定性,导致飞行过程复杂。文中首先讨论了飞翼无人机鲁棒控制的概念和意义,重点描述了鲁棒控制‘最坏情况设计’的思想,以确保在各种环境下系统的稳定性。然后阐述了鲁棒控制的具体流程,涉及系统建模、不确定性分析、鲁棒控制器(如H∞、滑模、自适应控制)设计、仿真实验及硬件实验,最后提供了完整的Matlab源码与运行指南,并展示了开环和闭环系统的响应对比结果,证明所设计的鲁棒控制器的有效性。文章末尾对未来的研究方向提出了展望。 适合人群:从事航空航天工程的专业人士,尤其是专注于无人机构型控制领域的研究人员;以及有一定自动化控制理论基础并对Matlab仿真感兴趣的学习者。 使用场景及目标:本篇文章主要面向希望通过理论研究提升无人机控制能力的学者或从业者,帮助他们掌握从建模到验证一套完整的鲁棒控制方法论,并为解决实际工程问题奠定坚实理论基础。此外,对于学生来说,这是一个很好的案例教学材料。 其他说明:提供的仿真代码不仅可用于科研学习也可以作为工业项目中初步设计的一部分参考素材。

Global site tag (gtag.js) - Google Analytics