回溯法之数独 详解

我从高中起就很喜欢数独这种娱乐方式,喜欢那种为了解出一个数独的执着,喜欢那份坚持,出于这种心情,我选择用java来实现一个数独从无到有的过程。喜爱玩数独的人应该知道,数独的限制条件很有意思:首先,一个9*9的九宫格被分成了九个区域,如图所示,不同颜色区域划分成不同区域。


图一

限制条件1:同一个格子内(色块)不能出现相同的数;

限制条件2:同一行内不能出现相同的数字

限制条件3:同一列内不能出现相同的数字

如何在满足上述条件的同时,还将这81个格子填满?这就是我今天要分享给大家的内容。

首先,我们可以将问题简化一下,我可以先把数字一存放到格子中,然后放置数字二,知道存放数字九,将数字一(二、三、...、九)放入九宫格的过程和八皇后问题非常相似(关于八皇后问题可以查看我上一篇博客八皇后问题),所以现在问题很简单了,问题就变成了依次将数字1~9放入九宫格,但是,问题不会就这么简单的,在实现代码的过程中,我发现,如果在放置数字7的时候,没有合法的位置(这种情况显然是存在的),那么现在就需要回溯到上一个数字6了,但是问题出现了,在针对每个数字的回溯的时候,我明确的知道如果一行都无法方式放置,就该回溯了,放第一行没有合法位置放置,我就该回溯到上一个数字6,但是,回溯到数字6时,我怎么确定回溯到数字5的条件呢?关于这个数值是不确定的,数字6到数字5的阀值和数字5到数字4的阀值肯定是不同的?想了很久还是没能想象出完美的解决方法,我决定退而求其次,我将阀值设定为100,也就是说,到了100的阀值,我就继续向上回溯。


本人通过Java代码是实现了一个数独的生成,但是,因为本人无法在简书上将代码以一种整齐的方式展现给大家,所以,如果有想要程序代码的朋友可以移步到本人的CSDN:数独实现

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 由于上篇的算法存在一些不足,我们不免要继续研究数独游戏的完全解,以获得更高效高质量的生成算法,对于完全解的生成过程...
    Chris啊飞飞阅读 8,085评论 0 1
  • 微信公众号:小白算法关注可了解更多算法,并能领取免费资料。问题或建议,请公众号留言;文末有资料领取上一期算法回顾-...
    小白CV阅读 47,866评论 5 37
  • 项目的源代码在Github上托管,可以在这里查看。 PSP表格 思路 项目要求的程序主要需要实现两个功能: 求解数...
    系欲雨清阅读 1,441评论 0 2
  • 今天中午才从淄博赶回家,匆匆的吃饭后就去上班了,也没有去做营员资料的整理,看到刘霞张杰在群里互动,才知道不能再拖完...
    胡宝琴阅读 136评论 0 0
  • 在收到知乎服务号的推送后,值乎更新到了3.0版本,从这次推送来看,值乎已经作为一款正式的产品被推广到大众眼前了(笔...
    Dantesly阅读 846评论 0 49