第 27 讲:均衡数组
接下来我们来看一种稍微暴力一些的技巧,叫均衡数组(Aligned Subset Exclusion)。
Part 1 均衡数对(Aligned Pair Exclusion)

如图所示,观察r12c6。在无计可施的情况下,我们来枚举这两格的所有填数情况。那么,r12c6都是三值格,所以就应该有九种不同的填法。我们一一罗列出来:

第一列表示r1c6填的所有可能,第二列表示r2c6填的所有可能。随后我们发现,有一种特别的情况,使得它所有对应的情况,全部都是错误的。就是那个r2c6 = 8。当r2c6 = 8的时候,r1c6的所有填数可能与之的组合都不对。正是因为如此,所以r2c6 <> 8。
这个结构称为均衡数对(Aligned Pair Exclusion),它的逻辑很暴力——枚举。说白了就是一个一个去找。更大的结构就是下面的这个例子了。
Part 2 均衡三数组(Aligned Triple Exclusion)

按照刚才的逻辑,我们把r1c46和r2c1的所有填数情况都枚举一遍。

随后发现,所有r1c4 = 4的情况均是错误的。所以,r1c4 <> 4。
这个就是均衡三数组(Aligned Triple Exclusion)了。
Part 3 均衡四数组(Aligned Quadruple Exclusion)

可怕的枚举情况。一共我们需要枚举r7c6、r8c27和r9c4四个的所有填数组合。候选数一共是2 * 3 * 3 * 3 = 54种情况!
不过,r8c2 = 7时,其它三个单元格的所有填数情况全部都会导致矛盾,所以r8c2 <> 7。
Part 4 为什么如此暴力的技巧,也会放在这里介绍?
均衡数组一直饱受争议,因为它的推理方式过于暴力,并且不容易观察到。在此为大家介绍一种观察方式。
首先,由于均衡数组的枚举单元格是不定的,所以我们此时按照每一大行和大列的方式搜寻。如果找的是均衡数对,则去找大行和大列存在的双值格(含有两个候选数的单元格),如果这样的双值格较多,就有一定可能产生均衡数对(但如果这样的单元格较少,就不容易得到类似于均衡数对枚举而产生的矛盾现象);那如果是均衡三数组,则去寻找大量的三值格(含有三个候选数的单元格)和双值格,看是否这样的单元格很多。如果这样的单元格很多,则我们可以知道的是,这样的均衡三数组很有可能出现(当然,也有可能不存在,只是很大程度满足了结构需求了)。
当结构满足要求的时候,这个时候就去看双值格和三值格涉及的所有数字,然后去寻找只有这些候选数的单元格,最后才会针对这样的结构进行枚举推导。而均衡数组经常被改写为待定数组的某些形式,但有时也不一定比均衡数组观察起来方便。
那么,整个待定数组的基本使用技巧就讲到这里,这也象征着进阶技巧已经全部讲完了,接下来我们将进入到链的学习之中。