我从高中起就很喜欢数独这种娱乐方式,喜欢那种为了解出一个数独的执着,喜欢那份坚持,出于这种心情,我选择用java来实现一个数独从无到有的过程。喜爱玩数独的人应该知道,数独的限制条件很有意思:首先,一个9*9的九宫格被分成了九个区域,如图所示,不同颜色区域划分成不同区域。
限制条件1:同一个格子内(色块)不能出现相同的数;
限制条件2:同一行内不能出现相同的数字
限制条件3:同一列内不能出现相同的数字
如何在满足上述条件的同时,还将这81个格子填满?这就是我今天要分享给大家的内容。
首先,我们可以将问题简化一下,我可以先把数字一存放到格子中,然后放置数字二,知道存放数字九,将数字一(二、三、...、九)放入九宫格的过程和八皇后问题非常相似(关于八皇后问题可以查看我上一篇博客八皇后问题),所以现在问题很简单了,问题就变成了依次将数字1~9放入九宫格,但是,问题不会就这么简单的,在实现代码的过程中,我发现,如果在放置数字7的时候,没有合法的位置(这种情况显然是存在的),那么现在就需要回溯到上一个数字6了,但是问题出现了,在针对每个数字的回溯的时候,我明确的知道如果一行都无法方式放置,就该回溯了,放第一行没有合法位置放置,我就该回溯到上一个数字6,但是,回溯到数字6时,我怎么确定回溯到数字5的条件呢?关于这个数值是不确定的,数字6到数字5的阀值和数字5到数字4的阀值肯定是不同的?想了很久还是没能想象出完美的解决方法,我决定退而求其次,我将阀值设定为100,也就是说,到了100的阀值,我就继续向上回溯。
本人通过Java代码是实现了一个数独的生成,但是,因为本人无法在简书上将代码以一种整齐的方式展现给大家,所以,如果有想要程序代码的朋友可以移步到本人的CSDN:数独实现。