芬兰的数学巨匠因卡拉,耗费了三个月的时间,设计出一款当前世界最为艰难的数独挑战,它的解独一无二。因卡拉声称,只有反应最快、思维最敏锐的人方能攻破这道谜题。
今日,让我们深入探讨一下如何运用深度优先搜索算法来求解数独。下面的代码示例是经过精心编写的,每一步都附有详细的解释。
环境配置
Python版本:3.6.0
在此前提下,若矩阵中的数值为0,则表示该位置尚无数字填入。
依据数独的游戏规则,每个数字需满足三个条件:
1. 该数字在其所在行中不重复出现。
2. 该数字在其所在列中不重复出现。
3. 该数字在其所在的小九宫格内不重复。
函数depth_fit_num()采用递归方式填入数字。其中参数in_sd_matrix代表一个数组(使用浅拷贝),即每次递归都在原数组上进行操作。这是典型的递归应用。我们假设输入的数独至少存在一个解。
递归步骤详解
- 递归结束条件:当数组填满且符合数独规则时,递归结束。
- 递归主体1:双重for循环遍历9x9的宫格,对每个空格尝试填入1至9的数字。
- 递归主体2:调用depth_fit_num()进行深度优先搜索。
- 递归主体3:若发现某层递归中该空格无法填入1至9的任何数字,则回溯至上层递归,重置当前位置为0并返回False结束该层递归。
- 最终,当递归循环体全部完成且无错误时,返回True并结束该层递归。
(注:可通过单步调试查看每次递归过程中in_sd_matrix矩阵数值的变化。)
简单来说,该递归函数在9x9的宫格中逐个尝试填入1~9的数字,并判断是否符合数独规则。若发现不满足条件的位置,则回溯至上一步尝试其他数字。如此反复直至找到唯一解或确定无解。
输出展示与美化
在算法设计完成后,还需对输出结果进行美化与展示。这里主要是对输出的矩阵进行格式化处理,以红色标注数独题目,以绿色标注填入的答案。这样的区分使得结果更加直观明了。
主函数与输入输出
主函数负责接收输入的矩阵并进行深拷贝(用于对比题目与答案)。随后调用先前编写的数独求解算法。最后展示输入与输出结果。
建议与学习支持: