数独 ( 三 ) ——解数独

﹥>﹥吖頭↗ 提交于 2020-01-15 05:09:49

数独 ( 三 ) ——解数独

我的地址:https://github.com/gmj0301/gmj
请翻看前面的博客,有细节上的修改。

解题思路

使用深度优先搜索方法,该过程简单。但是当求解题目数量达到很大时,所用时间很长。剪枝是很重要的一个环节。

剪枝过程

对于数独终局的每一个位置,都代表递归过程中的一层,每次在当前位置填入一个数字后,通过遍历当前行、当前列、以及当前 3 × 3 网格中的数字,就可以排除不符合条件的数字,从而达到剪枝的目的。
剪枝的过程其实已经完成了对当前数独的合法性的检查。

函数设计

judge函数

在这里插入图片描述
当把数字填入蓝色的空时,填入的数字,要考虑是否与黄色部分重复,重复不能填入。
机器不能像人一样,可以在填入之前就可直接判断出是否重复,需要选定一个数字填入后再判断。
判断过程有三步:

  1. 该数字所处行是否有重复,如果有,返回 false;
  2. 该数字所处列是否有重复,如果有,返回 false;
  3. 该数字所处九宫格是否有重复,如果有,返回 false;

在判断第 3 步时,需找到九宫格的数组下标范围。
在设计时,我的存储数独的数组下标本身比他的个数少 1,需先除以 3 确定是第几个行或列,再乘以 3 确定该九宫格的第一行,加 2 确定最后行。
如,检查下标为 [ 0, 2 ] 位置的数字,0 ÷ 3 = 0,0 × 3 = 0,0 + 2 = 2,第一个九宫格的行数由 0 到 2。
2 ÷ 3 = 0,0 × 3 = 0,0 + 2 = 2,第一个九宫格的列数由 0 到 2。

深度优先搜索函数

在这里插入图片描述
由于目前在考试,所以博客与GitHub更新缓慢。

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!