今年1月1日我开始订阅钱江晚报,几期读下来,对生活家每周五的游戏中的数独情有独钟。不过,要是手工计算起来,就比较麻烦。再加上我工作关系,自己用ORACLE的存储过程写了一段小代码。几次下来,基本都可以迅速而且准确地解出数独。
以下给大家大致解释一下算法:
1.对所有未定的格子都初始化为“1、2、3、4、5、6、7、8、9”。
2.在每个未定的格子中,根据纵列中已经确定的格子的值,从待定列表中除去该纵列中已确定的唯一的格子中所包含的值。
3.在每个未定的格子中,根据横列中已经确定的格子的值,从待定列表中除去该纵列中已确定的唯一的格子中所包含的值。
4.在每个未定的格子中,根据3×3格子中已经确定的格子的值,从待定列表中除去该纵列中已确定的唯一的格子中所包含的值。
5.对每个格子遍历(按顺序对每个元素都做某种操作,如检索等)。
6.所有格子遍历后,若还存在未确定的格子,重复上述过程。
一般遍历五次后,入门级的数独所有的格子都只剩唯一解。但是对于进阶级和骨灰级的题目,无法根据给出的条件,直接确定所有的格子。此时,需对未确定的格子中可能值进行推演:
这会有三种可能结果:
1.猜测的数字不对,导致行、列、3×3的格子出现重复的数字,则用下一个数字重新演算。
2.猜测的数字给出后,无法得到正确的解,也不导致某一规程出现互斥,则该数正确,对下一个不确定的格子进行推演,直至数独求解。
3.猜测的数字全部给出后,得到最终数独的解。
Jiang Xun