数独完全解生成- 高效回溯算法

由于上篇的算法存在一些不足,我们不免要继续研究数独游戏的完全解,以获得更高效高质量的生成算法,对于完全解的生成过程,我们一般是采用回溯法来产生整个九宫格的所有的数据。而对于九九八十一格的数独游戏完整解生成,我们尝试按常规的回溯方法来实现,不免会出现回溯的解空间过于庞大而导致回溯的时间过长而无法满足游戏中我们产生游戏完全解的需要。为此,我们需要一种高效的完全解的生成算法,以满足我们在数独游戏中快速的产生完全解。对此,我们需要对数独进行进一步的探索和研究。

那首先我们来了解一下数独游戏,数独的基本规则就是在如下图所示的大九宫格中的九九八十一格里随机填入1-9这九个数字中的任意一个,并且要保证每一横行、竖行的九个数字没有重复数字,还要保证每一个小九宫格中的九个数字也不能重复。如下图,我们将每一个小九宫格涂上了不同的颜色以便于区分。

要生成合法的数独完全解,那我们必须了解数独完全解的所具有的特性。那我们下面看一组标准的数独完全解的例子,如下所示我们看到一组数独完全解(这是我们实现的算法生成的解)。

871932645

495861237

632754819

528473196

913625784

764198352

287349561

146587923

359216478

通过检查,我们看到上面这一组解是满足数独规则的。但我们为了研究数独完全解的特性,需要将这一组解放入九宫格中进行分析,如下图我们将这一组解放入到九宫格,首先我们知道,整个大九宫格(九九八十一格)中我们只能填入数字1-9,而我们看到的是横行、竖行和小九宫格都是九格,也就是说,我们在横行、竖行和小九宫格都必须使用到这九个数字。

若我们要生成一组数独完全解,那如果按传统的回溯方法来产生,那我们首先会从第一个方格(从左至右,从上至下)开始,先从1-9九个数字中选取一个数字填入该处,然后我们再从第二个方格开始,选取八个数字(按数独规则不能重复,则要除去刚刚填入的一个数字)中的一个,依此下去选填数字……当然后续方格中选择的数字,都会因为数独规则,使其所在横行、竖行和小九宫格中,其他已填方格中的数字对该处可填入的数字产生不同的条件约束。某种情况下,我们可能发现填到某格时,由于数独规则约束我们已经没有数字可以填入该处了,这时候我们就要开始回溯了,撤销上一步填入的数字,重新选择一个数字填入上一步的方格,然后继续开始本次的填数,若不行还得继续回溯。有时会因为某种制约,导致我们要不停回溯撤销重填。若按照这种思路做下去,我们发现由于解空间过于庞大,我们能生成合适的完全解可能要花比较长的时间。这样的算法思路根本无法满足我们快速产生完全解的需要。这时我们想到要去缩小回溯的解空间,让回溯的解空间尽量的减小。

于是我们开始的新的算法探索,如下图通过分析我们知道,1-9这九个数字一定都会被使用,而且是每一横行、竖行和每一个小九宫格都会有1-9中的一个数字。首先我们来对整个大九宫格进行划分,我们将整个大九宫格划分为九个小九宫格。按从左至右,从上至下排序,也就是上面三个分别为1、2、3中间三个分别为4、5、6,而下面三个分别为7、8、9。那我们先填1-9这九个数字中的“1”,我们观察下面图例的解可以看到。在第一个小九宫格中填入一个“1”,在第二、三个小九宫格中也要填入一个“1”,而要满足数独规则,第二个小九宫格中填入的“1”就不能和第一个小九宫格的“1”在同一行,同时第三个小九宫格填入的数字“1”也不能和第一、二个小九宫格的“1”在同一行。以此类推下去,我们继续填第四、五、六、七、八、九个小九宫格中的“1”,当第九个小九宫格数字“1”填完以后,整个过程完全可以不用回溯。那我们接着开始填入1-9这九个数字中数字“2”,在第一个小九宫格中我们除去之前填入数字“1”被占用的位置,其他的八个空的方格我们都是可以随便填的,我们随机选取其中的一个空格,填入数字“2”。填完后,我们接着填第二个小九宫格中的数字“2”,填入的位置要求还是要满足数独规则的,在这里由于我们在每个小九宫格中1-9中的每个数字都填过一次,所以这里完全不用考虑小九宫格的数字不重复的问题,所以考虑的就是,每一横行、竖行是否满足数独规则,即填入的数字都不重复。这样我们按照一定的顺序依次在九个小九宫格中填入1-9这九个数字。当九个小九宫格的数字“9”填完。整个大九宫格九九八十一个数字填入完毕,那么符合数独规则的完全解也就应运而生。当然这里也会有回溯的情况产生,当我们某个数字在填入某个小九宫格时,发现其可填空着的方格在横行、竖行上都已有该数字,那么这时我们无法在此小九宫格填入该数字了,这时我们要回溯到上一个小九宫格中,撤销这个小九宫格填入的该数字,重新选取可填位置填入该数字(这里不用选取数字,数字已选定)。填入完成后,再回到本次需要填入该数字的小九宫格中选填该数字。我们需要把1-9这九个数字中的每一个数字在九个小九宫格中按照数独规则都填入一遍。当第9个小九宫格中数字“9”填入完成,数独完全解也就生成了。

该算法采用分治的思想将整个大九宫格分为九个小九宫格,1-9九个数字按顺序填入,排除了数字之间的限制约束,每个数字独立填入的回溯空间大大缩小,某些数字甚至无需回溯,例如此过程中的数字“1”和“9”就不需要进行回溯。同时我们产生时结合随机数选填位置,这样能保在持数字之间很好的随机性的同时,又在产生时间上极大的缩短了耗时。这样思路实现的代码产生出来的数独完全解,计算机耗时基本保持在几毫秒左右。就是以人工方式手动填入的方法,也可在几分钟之内产生一组合法的数独完全解。此算法相较于传统的回溯算法,其效率明显的提高了很多。

为了便于区分我们将1-9这九个数字标识不同的颜色。填入完成后的解,如下图所示。最后通过我们实现该算法的java代码的实际测试,其产生10000组解的实际平均耗时为3.25秒左右。实际测试中我们使用的是笔记本,后台也有运行其他的软件,我们有尝试将测试数据调至10000000组,该次测试过程中CPU占用率平均在50%左右,笔记本有轻微发热,最后耗时为52.98分钟,当然这些测试中我们并没有去验证产生数独完全解的唯一性,做这些测试只是为了验证数独完全解的产生速度。

在后一篇文章中,我们将介绍如何通过JAVA来实现该算法,相关问题可以留言联系或者关注我新浪微博。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 159,117评论 4 362
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,328评论 1 293
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,839评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,007评论 0 206
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,384评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,629评论 1 219
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,880评论 2 313
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,593评论 0 198
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,313评论 1 243
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,575评论 2 246
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,066评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,392评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,052评论 3 236
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,082评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,844评论 0 195
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,662评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,575评论 2 270

推荐阅读更多精彩内容

  • 作者:杨舸 跟数独游戏的结缘,是一次次的空中飞行。经常出差,如何消磨旅途时间?航空杂志都翻烂了,小说也不是每次出差...
    Sting阅读 12,675评论 1 8
  • 难度划分 影响数独难度的因素很多,就题目本身而言,包括最高难度的技巧、各种技巧所用次数、是否有隐藏及隐藏的深度及广...
    杨过的大雕阅读 3,295评论 0 3
  • 使用dancing links算法求解数独 博文来自这里:http://www.cnblogs.com/grene...
    Yihulee阅读 9,409评论 0 13
  • 一不小心就沉迷数独无法自拔,起初只是当做锻炼脑子的益智小游戏,后来看到了相关的数独解题技巧,才知道原来方格间还蕴藏...
    Icebay阅读 7,369评论 0 9
  • 我认识一阿姨成天嚷嚷他儿子有多好,在大城市干着多么牛逼的工作,年薪多少,有多少女孩子围着他转,他都不带正眼瞧一下的...
    非谓语阅读 169评论 0 1