引言
数独(及其前身)已经出现了一百多年。当它第一次出现时,人们实际上只能咬着笔抓着头发来解决数独题目。但现在我们有了强大的电脑!(现在的人就能在手机和电脑上做数独题啦!)
在这篇文章中,你会学到如何摇身一变,成为一名数独大师,在几秒钟时间内就能解出一般人要花几小时才能解出的难题。当然,更重要的是,你会一步步的学习如何使用机器学习(Machine Learning)轻松解决每个数独。设想一下,如果有计算机来做数独,谁还需要思考呢,当然,多做数独还是真的可以健脑的。(我没有开挂做数独啊,不要抓我)

我没有开挂
Peter Norvig最先使用Python开发了一个优雅的程序,通过约束网格传播和搜索以此来解出数独。Norvig的解决方案被认为是目前十分经典的一个解决数独的方案,当人们通过编程来解数独时经常被引用。在回顾数独和一些策略之后,本文将逐步分解Norvig的代码,以便你能真正了解它的工作方式。
什么是数独?
数独是源自于18世纪瑞士的一种数学游戏。是一种传统的运用纸、笔进行演算的逻辑游戏。人们需要根据9×9的盘面上的已知数字,一一推理出所有剩余空格的数字,并满足每一行、每一列、每一个九宫格(3*3)内的数字均含1-9,不重复

数独
如图,突出显示在蓝色正方形中的数字不能在与同列同行和宫相对应的任何黄色正方形中重复
如何解数独?
其实一般做数独题的时候,只需要不断做两件事就OK了。要做的第一件事是就是排除行,列和宫中的已知数字。您要做的第二件事就是寻找一个可能填写的候选数。
在下面给出的示例中,每个正方形中的可能填写的数字以较小的字体标注。通过排除出现在同一列,行或宫中的已经重复的数字来确定剩下可能的数字。大多数人仅仅只会一次确定一个宫的可能数量,而不是直接确定整个网格中所有能填写的数字(暗数、候选数)。

所有可能填写的数字
进行排除操作后,你可以寻找仅剩余一种情况的格子。在下面的示例中,两个黄色突出显示的正方形必须包含1和8,因为其他所有的可能性已被排除,它们填在别的格子中会出现重复。

黄色的格子中只能填一种情况
现在已知以黄色突出显示的两个格子,这又排除了其他格子的更多可能性。现在我们可以知道以蓝色突出显示的格子必须填7。

更多的可能性被排除了
如果你继续不断的按照此法进行排除和确定,最终可能会达到能够完全确定某个3*3的格子或行或列的情况。

一个九宫格被完全约束了
在下面的示例中,我们可以确定以蓝色突出显示的格子的解必须为6,因为数字6不可能出现在黄色宫中的其他任何的格子中。

继续确定格子中的数字
有时,我们在求解的时候可能会遇到这种情况,似乎每个未解决的3*3的格子中有多个可能的值。这意味着我们可以选择多种路径,但至于哪条路才能最终得到结果就不知道了。
在这个选择上,我们必须尝试每个选项。选择一条路并继续求解,直到按这条路走下去最后只能得到“此路不通”的答案。然后,将不得不回溯到分歧点并尝试其它的路。
但是我们可以使用二叉搜索树在计算机上轻松完成此类检索。当有两个不同的数字都可以作为一个3*3的格子的答案时,我们可以尝试引入两种不同的可能性。二叉搜索树将使算法沿选择的一个分支下降,然后尝试不同的选择。