Skip to content

数组占位

数组占位法是一种通过观察一组候选数的放置情况,对未填单元格进行候选数删除的技巧。

它基于这样一个事实:在一个区域(行、列、宫)中,当n个候选数恰好占据n个单元格时,无论最终这n个数在这n个单元格中如何分布,都可以保证这n个数会作为答案数占据这n个单元格。这可以带来两种推论:

  • 如果这n个单元格中只有这n个数字作为候选数,也就是没有其他候选数出现在这n个单元格中,那么该区域中的其他单元格里就不能再出现这n个候选数之一。因为无论这n个候选数作为答案数如何分布在这n个单元格中,这n个数字都必然会在该区域中各出现一次。进而可以将这n个数字从该区域其他单元格的候选数中删除;否则,某个候选数就会出现多次,从而违反数独规则。这种情况称为“裸数组”。

  • 如果一个区域中的某n个候选数集中出现在n个单元格里,但这n个单元格中还含有其他候选数,那么这些“其他候选数”就可以从这n个单元格中删除。因为如果在这n个单元格中填入其他候选数,就会导致这n个候选数中的某些数字没有位置可填,同样会违反数独规则(每个数字必须恰好出现一次)。这种情况称为“隐数组”。

这种通过找到“n个数占n个单元格”来进行候选数删除的技巧,称为“数组占位”。其中候选数的个数n也称为数组的“大小”。由于数组的大小会影响技巧的发现难度,所以一般会把不同大小的数组划分为不同的技巧。

数组大小n裸数组
(删其他单元格中的数组候选数)
隐数组
(删数组所在单元格中的其他候选数)
2裸数对隐数对
3裸三数组隐三数组
4裸四数组隐四数组

理论上,n可以是19中的任何一个整数。如果n=1,数组就退化成了单数;如果n=9,就相当于一个空的、尚未填写任何数字的区域。一般提到“数组占位”法时,n通常取2,3,4中的一个值。对于n5的情况,通常都可以在同一区域里找到数量更少的占位。例如,即使某一区域中九个单元格都没有填数,如果其中有一个n=5的数组占据了5个单元格,那么必然存在另外4个候选数占据另外4个单元格,从而形成一个四数组占位。

数组占位并不要求这n个数字在n个单元格中都实际出现。例如,提到“三数组”时,假设形成数组的三个数字分别为abc,并不要求它们占据的三个单元格中的候选数都同时包含{a,b,c};它们也可以分别是{a,b}{a,c}{a,b,c}。也就是说,只要这三个单元格的候选数并集包含{a,b,c}即可。