数独 ( 三 ) ——解数独
我的地址:https://github.com/gmj0301/gmj
请翻看前面的博客,有细节上的修改。
解题思路
使用深度优先搜索方法,该过程简单。但是当求解题目数量达到很大时,所用时间很长。剪枝是很重要的一个环节。
剪枝过程
对于数独终局的每一个位置,都代表递归过程中的一层,每次在当前位置填入一个数字后,通过遍历当前行、当前列、以及当前 3 × 3 网格中的数字,就可以排除不符合条件的数字,从而达到剪枝的目的。
剪枝的过程其实已经完成了对当前数独的合法性的检查。
函数设计
judge函数
当把数字填入蓝色的空时,填入的数字,要考虑是否与黄色部分重复,重复不能填入。
机器不能像人一样,可以在填入之前就可直接判断出是否重复,需要选定一个数字填入后再判断。
判断过程有三步:
- 该数字所处行是否有重复,如果有,返回 false;
- 该数字所处列是否有重复,如果有,返回 false;
- 该数字所处九宫格是否有重复,如果有,返回 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更新缓慢。
来源:CSDN
作者:画画匠
链接:https://blog.csdn.net/weixin_43153229/article/details/103884601