自动生成指定特征的数独题目(未完待续)

  我中学时常填数独,好像是来自《课堂内外》杂志,倒数一二页有时候会有个数独。

  而现在,我想做个数独机,预设功能如下:用户选择特征,数独机随机生成符合此特征的一个数独。

  因为选择的特征一般来说是若干个数独共有的特征,只有极特别的特征单属于一两个数独题。

  首先可以计算一下所有的数独题目共有多少个,这个不难,毕竟每个数独只有9*9==81个格子,并且只能填入1—9这9个数字,所有数独的总量是有限的。

(设:崭新数独题已被数字占领的格子为“小黑格”;所有需要玩家来填入的格子为“大白格”;游戏过程中被玩家填入的并且已经确定正确的格子再加上小黑格,称为“大黑格”,在产生大黑格的情况下,剩余的空白格为“小白格”。设:已经被填满的数独为“数独表”。此称谓只在本文有效,便于文章理解。)

  最简单的数独类型无疑就是初始格有80个,只需要玩家填入一个数字即可,然后越难的题目小黑格越少。(当然对于题目的难易,不同的玩家有不同的标准,这里粗略地按照大白格的多少来定义。)最难的数独题,按数独的定义来说,也就是可谓“最简条件”,即这个数独题目,把其上任何一个初始数字拿掉,都将使填数过程中的逻辑推导出现断层,使解题者根本无法完成数独。但如果考虑到数字空间分布,或者是逻辑嵌套深度,最简条件态的数独们又可以被另行评估出不同的难易程度。

  也不能说出题者把几个数字随机摆到格子里就算是数独题,必须要能让玩家根据小黑格,经过正确的逻辑推导,最终能给出一个正确答案才行。因为有的情况下,小黑格的分布是不足以用来推导出大白格的。

  所以根据以上两段,数独题目的总数并非简单的把若干个1—9随便放入9*9方格中算出所有可能的组合情况,这些组合中,有一些是无法用于完成数独的,要排除掉,还有小黑格有81个(即所有格子已被填满)的情况也要排除掉(你至少要留出一个空格来给玩家吧!!“~-~”)。

  关于数独中的几个数值需要先整理一下:

  1,总共81个格

  2,每行9格互斥,每列9格互斥,每方9格互斥

  3,已完成的数独总是包含九个1,九个2,九个3,... ,九个8,九个9。

  4,据Wiki表述,数独表共有6,670,903,752,021,072,936,960个,除去具有对称变换相似性的那些,就少得多了,只剩5,472,730,538个。

  5,而最简条件态的数独题,就多得多了,原因显而易见,一个完成态数独表可以通过删减数字,生成多个最简条件数独题目。Wiki显示,某计算(翻译版)估计共有3.10 × 1037个最简条件题目,另外加上2.55 × 1025个对称变换相似的最简条件题目。(这些数字具体怎么统计出来的下文再研究。)

  (一个表对应多个题,意味着不同的数独题可能会共有同一个答案。)

  关于数独的几个疑问也需要先整理一下:

  1,一个数度题目是否可能存在多个答案?根据网上的资料来看,出现多个答案的数独是不完善的。即标准的数独题目应该只存在一个答案。这就要求出题者限制更多的条件以防出现冗余态。

  一种方法属于“填进去”,先填一个,再填一个,直到可以用来作为一个数独题,能被完整地推导出来。先为9*9方格定义位置,可以把从左到右从上到下的每个方格依次编号,使每一个格子都有个名字,比如“22”代表第二行第二个格子。如下图:

 

 

  此方法第一步在11格(即第一行第一格)尝试填入数字1,此时会导致编号为(行内12,13,14,15,16,17,18,19以及列内21,31,41,51,61,71,81,91以及方内(3*3小方)另外四个22,23,32,33)的格子不能填入1。(需要注意的是,最后方内需要考虑的总是4个,是因为任一参照格在同方内的同行同列格总会占去方内四个格子,加上参照格,共5个,剩余方内的相关格就只剩四个。)它们不能再填1了,即是除去它们,以及已填的11格,数独内剩余60个空格中可以任取一格再次填入1(并不是说可以在60个格中任选几个都能填1,有的会排斥),但这里先不说再填1的事,说说第二步:第一步已占领11格,接下来占领12格,12格不能填1,所以可以填入其它八个,

 

  另一种方法刚好相反,“拿出来”,比如拿到一个已完成的数独,每个格都已被正确填入,然后逐步挖出一部分数字,最多挖到最简条件态,此过程中的任一状态都可以作为一个数独题。完成态数独表的生成比较简单,假设已列为参照,先算出每一列所有的排列情况,即将9个不同元素排序,共有多少种组合。很简单,P(9,9)=9!=362880。

 

  两种方法的难点及重点都在于,如何判断此时的数字分布是否已成玩成数独的充分条件。

转载于:https://www.cnblogs.com/oler/p/9644365.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值