首页 > 编程知识 正文

我与数独的成长故事,我和数独的故事

时间:2023-05-05 21:04:16 阅读:278757 作者:4822

 

数独,是一个规则非常简单的,用数字来表示的逻辑推理游戏。却与数字运算毫无关系,你完全可以把数字换成字母,或换成不同的色块。

最初接触数独,是在十年前,因为那时用了一款智能手机,诺基亚 5800。当然,那时的智能手机可比不上现在的智能手机,但也是彩色大屏,塞班S60的操作系统,可以自由安装软件。当时自己找到手机游戏,便是数独,在手机上用一支触控笔来定位填数。

在玩的时候,就在考虑怎么样用程序的方法来解题。然后在2009年9月,也就有了初步的想法,并在计算机上实现,采用了递归的方法,并根据相关约束条件进行了优化,算法的执行效率还不错,解一道题通常都在一秒以内。因为是递归穷举,所以对于多解数独也能将其解全部找出。

而后的好几年时间里,都只是在手机上继续玩这个游戏,而没有再进一步考虑数独程序的问题。直到最近两三年,工作上换了一个岗位,每天接触的都是纯粹的计算机技术问题,不再像以前的岗位那样繁杂,比较单纯,也就有了时间和兴致再次考虑数独程序。

从塞班的系统到安卓的系统,里面的很多数独游戏,其题目都是固定的,不同难度的题目有几十甚至几百道,从初级玩到高级,全部关卡玩完,游戏程序就可以删掉了。所以自己在考虑写程序时,也就要实现能快速的生成数独题目,还要能对数独题按人解题的思路进行求解,评价其难度。

数独程序需要考虑的,主要有三个问题:求解、出题、难度评价。

计算机求解数独,其实并不难,算法有很多,基本上都可以秒解,其中最有效的是 Dancing Links 算法,它其实也是一种回溯算法,不过是它非常巧妙的运用了双向十字链表的数据结构,将数独的求解转化为一个完全覆盖问题。可以说是以空间换取时间,求解最快。目前,我已有完整的 Dancing Links 算法的C代码,并运用到自己的Windows版和Android版的程序中。

数独题目的生成,也有很多方法,如挖空法、模板法。一般我们所看到的手机上的数独游戏的题目,都是采用模板法生成的,这种方法所生成的数独题,其盘面上有数的位置,都是关于中心对称的。我所使用的是随机生成算法,这样生成的题目,有数的位置是杂乱的,当然,难度也是随机的。目前,经过一些优化,出题效率还是很高的。曾用个人笔记本电脑,花了三十分钟,出了十万道题。这十万道题,已放置在网上,供公开下载。

数独的难度评价,是按人解题的思路来说的。对于计算机解题来说,使用递归穷举,无所谓难度,若要考虑计算机解题的难度,可能是盘面上提示数的多少。

这里要补充说明一点的是,可能大家认为盘面上的已有数越少,难度越大。其实并不是这样的,有些17个已有数的数独题,却是非常简单的。而有很多高难度的数独题,已有数在24-26个左右。若盘面的已有数超过了30,一般也是比较简单的,倒也是符合前面的常理了。对于任意一道数独题,至少需要多少个已有数,也有国外的人士通过计算机穷举了,这个数字是17。

通常我们人工求解数独,会从最基本的解题规则一步一步开始,用基本规则无法继续求解时,再套用初级规则,或高级规则,甚至是更高级别的规则。一般人所用到的规则,都还是基本规则,熟练的人会用到一些初级规则。只有经过专业训练的人,才能掌握高级的解题规则。很遗憾,本人目前掌握的也还只到初级规则,所以,我自己写的程序,按人求解的思路进行难度评价时,也还只覆盖到了初级规则,但这对于大部分人来说,已经足够了。把很多手机APP中的数独程序中的所谓大师级的题目,用不同的软件来评价一下难度,也发现它还只处在使用初级规则即可解题的级别。毕竟,高难度的数独题,其逻辑推理,真的很复杂,高级的规则有很多,有时需要反复多次使用不同的高级规则之后,才能填入一个数,况且在九九八十一个全是数字的格子里面,通过眼睛去看而发现一条规则,也很不容易发现,所以,一般人就不要拿高难度的题目来虐自己。我只能说,高难度的题目,并不是给人做的。所以,大众的手机数独程序里面,也不会收录大量的高难度题目,除非有变态程序员觉得虐游戏玩家很开心。专业的数独玩家,自然也有专业的数独程序。

 

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。