我的基本的思路是,按照约束条件,每个空格应当分别在横向,纵向和方格内产生三个可选解的集合,这三个可选解求交集,既是该空格最终的可选解,有如下几种情况:
1、如果该解是唯一的,则将该解填入该位置,重新检索数独集合(重新检索可以有其它的思路,这种思路编码上更简单)
2、如果该解不是唯一的,将该解保存入一个解向量组(该解向量应当对所有解根据个数进行从少到多进行排序)
3、所有空格检索完毕后,从解向量中找出第一个解向量组(应该是最少的一个,或之一),从中任选一个作为解,重新检索数组,如果不对,再使用其它可选解进行尝试(这种方式有点类似树,逐渐剪枝的过程)
这种方式应当有如下方法和数据空间
1、从数独中按照顺序查找空白点
2、对给定位置查找横向可选解
3、对给定位置查找纵向可选解
4、对给定位置查找方块内可选解
5、对所有可选解求交集,得到最终可选解
-- 这里有一个合适的数据结构存储所有可选解(前面提到的向量是一种可选的方案)
----这个数据结构可以对所有可选解进行排序
----如果可能,这个数据结构能够将对指定解后,所有相关的可选解进行剪枝(这样能够避免重新搜索)
----最简单的方式就是每个解向量组包含一组坐标,该坐标标定该解在数独中的位置,通过该位置,可定位受影响的行,列,和方块,从受影响的元素内删掉相关的数置即可。