欢迎光临散文网 会员登陆 & 注册

第 35 讲:毛刺数组

2021-07-13 07:27 作者:SunnieShine  | 我要投稿

数组这个技巧在我们之前其实介绍过,不过之前的数组(显性、隐性、区块数组甚至是跨区数组)都是可以直接用的。现在来看一个不能直接用的数组形式。

Part 1 显性毛刺数组

我们先来看一则示例。

如图所示,链如下表示:

按照最开始的逻辑,设r7c6(7)为假,则得到r8c6(7)真、r8c6(1)假、r9c5(1)真、r9c1(1)假。而此时发现,r9c1(1)假之后,r9c13形成了3、7显性数对。

换句话说,r7c6(7)有两种填数情况,其为假时,得到r9c13(37)显性数对结构,换句话说,r9c13(37)显性数对在此时是为真的(结构成立就为真,结构不成立时为假)。所以r7c6(7)和r9c13(37)(即这个显性数对)之中至少有一个为真,于是删除掉它们的交集。那一个显性数对和一个候选数怎么找交集呢?

  • r7c6(7)为真时,可以删的是r7c6所在区域下所有的单元格(相关格)内的7;

  • r9c13(37)为真时,可以删的是b7和r9内其余单元格的候选数3和7。

所以对于此题来说,它们的交集,只有r7c1(7)了,所以r7c1 <> 7。

这个结构是不是很神奇?你会发现,在末端嵌入了一个显性数对,但前提是r9c1(1)为假时,这个显性数对才真正成立,所以它可能并不是一个真正的数组,而类似于我们之前学到的鱼鳍的逻辑。所以我们一般称这种结构叫毛刺显性数对显性毛刺数对(Burred Naked Pair),毛刺(Burr)一词用来表示结构多出来了一点点东西,并使这一点点为假时,本体结构才真正成立。关于毛刺,我们还将在链的构造的内容里详细谈论它的基本逻辑和思维方式。

实际上,毛刺和鱼鳍是完全一样的东西,只是鱼鳍一般针对于鱼结构,毛刺则针对于其余的非鱼结构的技巧。而正是因为它们如此接近,所以毛刺一词在英文里用的Burr一词,也动词化,加上了分词性形容词的后缀-ed(burred)。

毛刺这个概念是由中国玩家探长(网名,Borescoper)提出。

Part 2 隐性毛刺数组

如图所示。链如下所示:

如果r46c1(3)区块为假时,r7c1(3)为真(之前也提到过这一点,区块和候选数的强关系怎么推导)。于是,r7c1(6)假、r7c3(6)真、r7c3(8)假。观察c3,我们可以发现,r7c3(8)为假时,c3刚好产生78隐性数对,在r45c3。换句话说,当r7c3(8)为假时,r45c3(78)隐性数对为真。于是也就得到了r46c1(3)区块和r45c3(78)隐性数对至少一个为真。

  • r46c1(3)区块可以删除的是c1和b4内的其余位置的候选数3;

  • r45c3(78)隐性数对可以删除的是r45c3内其余的候选数。

所以,它们的交集,应该是r45c3(3)。所以r45c3 <> 3。

那么,类比于刚才的显性毛刺数组,隐性毛刺数组(或毛刺隐性数组,Burred Hidden Subset)指的是差一点形成隐性数组的情况,比如例子之中的r457c3(78)(别忘了r7c3也有候选数7哦)。

Part 3 毛刺数组节点的真假性

刚才我们接触到的两则示例,都是当节点进入的时候使得毛刺数组为真的结构,我们此时就接触了一种新的节点类型:毛刺数组。

不过,毛刺数组为假是个什么样子呢?所谓的毛刺数组为假,就是让毛刺数组结构的数组本身不成立,即破坏数组。

如何去破坏呢?我们知道,数组的核心本质是“n个单元格只能填入n种数字”和“n种数字只能放在n个单元格里”,那么破坏的方式很简单:要么里面有重复数字(这显然不可能,因为数组结构的内部是不可能出现重复数字的,一旦出现就违背了数独规则);要么里面包含我们不需要的数字(比如一个毛刺数对里包含候选数1、2、7,如果7不见了就形成了1和2的数对。那么为了破坏数对,我们在其中填入数字7,这样就破坏了1和2的数对结构)。只要出现这两种情况,毛刺数组就被破坏了,也就称毛刺数组为假。

例如我们来看一则毛刺数组为假的示例。

如图所示,我们从r5c5(5)开始推理,并假设其为假。按照顺序,我们可以依次得到r7c5(5)为真、r8c4(5)为假、r8c1(5)为真。此时,当r8c1(5)为真后,r89c1不管你怎么填,显然都是无法形成2和7的隐性数对了,所以该结构一定为假,故r89c1(27)为假。

接着,当毛刺隐性数对为假的时候,r4c1(7)就必须为真了。可这是为什么呢?试想一下,毛刺隐性数对为假之后,由于是2和7的隐性数对的关系,按常理说,在c1上的2和7应该只能放在r89c1里,但实际上是7出现了三次(r489c1),而2只有两次(r89c1),而且此时经过推导,我们已经得到了r8c1(5)为真了,此时r9c1是不得不填入2的,否则c1就放不了2了。那既然r9c1 = 2的话,7就只能放在唯一一处地方:r4c1了,因为c1只有r589c1三处位置可以放7。

所以,当毛刺数对节点为假的时候,不得不让这个r4c1(7)为真,链才可以继续推导下去。

当然,如果你对逆否命题比较熟悉,你可以尝试使用逆否命题论证:如果我们设定原命题是“如果2和7的隐性数对为假,则必须r4c1(7)为真”;那么其逆否命题则是“如果r4c1(7)为假,则2和7的隐性数对为真”。这是显然的,因为r4c1 <> 7后,c1只有两处可以放下2和7,而且都是r89c1,所以这两个单元格形成关于2和7的隐性数对,即隐性数对为真。所以逆否命题是成立的;既然逆否命题成立,那原命题也成立,所以原命题的论证结果为真(这实际上是把这个强关系反向来证明了,可以看到,从反向理解这个逻辑反而比正向理解要简单,所以建议大家如果不能理解一些逻辑的时候,尝试使用逆否命题和原命题等价的思维来解释)。

当然,这里再给出第三种理解。我们直接把r5c2(7)和r8c1(5)用弱关系连起来。因为它们同真的话,c1将产生三个单元格只能放下5和7,导致矛盾的出现,所以它们不同真,即形成弱关系,如图所示。

Part 4 毛刺数组的解构

实际上,不论是显性毛刺数组还是隐性毛刺数组,我们都可以通过解构的方式,把结构本身解构(Deconstruct)为一个强或弱的ALS。我们举例说明一下。

如图所示,这个链比较复杂,嵌入了一个毛刺显性三数组。

首先假设r6c56(8)区块节点为假,则r6c89(8)为真,于是r45c7(8)为假。此时由于r245c7里的8全部没有了,于是形成显性三数组,所以r245c7(156)毛刺显性三数组节点为真,所以数组为真后可以删除r7c7(1),故r7c7(1)为假、r7c7(3)为真、r7c5(3)为假,r9c6(3)为真,r9c6(8)为假,r8c5(8)为真。

所以这个题目的删数在于r45c5(8),这是头尾两个节点的交集。

不过,有些时候,我们不得不将这个三数组解构。因为三数组有些时候我们不一定能看到,而取而代之地使用ALS的观察视角。所以实际上,显性三数组将对应一个合格的ALS区域,如图所示。

如图所示,我们将刚才的毛刺显性三数组节点解构为了一个两个区块节点的强关系:r24c7(1)=r45c7(8),而实际上,毛刺显性三数组里我们也并没有完整地使用到任何一个数字(比如原来的数组是1、5、6,而实际上我们涉及的强关系仅需要1和8就足够了,5和6根本就没用到),所以我们可以尝试解构,把毛刺数组解构为上述的ALS区域的强关系来使用;反之,有时候你也可以使用构造(Construct),将一个ALS改为一个合适的数组形式,来丰满结构,使之更容易理解。不过,有些时候ALS改写出来的数组可能不是很符合预期,所以我们不建议随时随地都使用构造。

由于对称性的约束,显性毛刺数组对应了强ALS区域,那么隐性毛刺数组就对应了WALS区域(即弱ALS)。因为ALS用的强关系,而WALS区域用的是弱关系,所以对于隐性毛刺数组的解构用得非常少。但是,你依然可以尝试从其它层面对毛刺隐性数组解构,比如拆分成多个单元格,进而得到意想不到的东西,例如下面的这则示例。

如图所示,链如下表示:

这个链的精彩之处,是在于链的开头和结尾。链头是3和8的毛刺隐性数对,而链尾则是56毛刺显性数对。那么根据链的证明思路,链头和链尾至少有一个节点成立。所以,5、6的显性数对和3、8的隐性数对的交集为r3c6(56),故r3c6 <> 56。当然,我们依然可以尝试解构(注意下面的解构方式),并得到下面两条链结构:

在上方书写的两种形式的开头,可能你会觉得链的写法里是不是漏掉了r2c6这格,其实不然。r3c6(38)=r6c6(8)是成立的,即使是两个候选数和一个候选数的特殊强关系。当它们同假时,r3c6将不会填入3或8,r6c6也不是8。这样一来,观察c6,你会发现,c6内填入3和8的位置,就只剩下了r2c6一处,可这样一格是不够填3和8两种数字的,所以是不行的,强关系就成立了。

另外,结尾的强关系r3c9(8)=r3c49(5)和r3c9(8)=r3c49(6)则直接利用之前的毛刺显性数组的解构模式进行解构,所以得到两个不同的强关系,所以有不同的删数。当然了,如果你嫌别扭,依然还是可以写作原来的数对形式的。所以实际上,这种形式的毛刺数组就不建议解构理解了,不过链头依然是可以解构的。

Part 5 毛刺数组的其它使用方式

5-1 节点重叠

如图所示,链如下表示:

链头是一个3和9的毛刺隐性数对,而到r8c5(4)时为假,而r8c5(4)和r6c5(3)不可同假,否则c5之中只有一处可填3和4两种数字,这显然是不行的,所以它们不可同假,即r6c5(3)应为真。最后得到了r5c9(3)为真,所以链头3和9的毛刺隐性数对和链尾r5c9(3)至少有一个节点为真,删掉它们的交集。39隐性数对成立时,删除r56c9的其余候选数,而再算上r5c9(3)成立的时候,能够删除的位置只有r5c9的其余候选数。所以r5c9 <> 67。

这个例子有些别扭的地方是,链头是一个毛刺隐性数组,而链尾,则是这个毛刺隐性数组里涉及的一个候选数,这就好像链尾被链头“吃掉了”一样。

接下来我们再来看一个示例。

5-2 间接删数的链

如图所示,这也是一个包含节点重叠的链结构,而且和上面那个示例的方式类似,只是上例用的是显性毛刺数组,而这里用的是隐性毛刺数组。链的表述如下:

这条诡异的链,就算是写出来了,也会发现r2c3 <> 5。它是怎么删掉的呢?

我们在之前的不连续环里介绍了,节点和删数是弱关系。所以,只要我们找到链头和链尾同时和可能要删的这个节点都是弱关系的话,那么删数就成立了。那么问题就变为了证明r7c3(7)-r2c3(5)。

如果你还不能理解为什么“链头和链尾和删数节点是弱关系,那么删数成立可以删”的逻辑的话,你可以这么去想这个问题。针对于此例而言,如果r7c3(7)和r2c3(5)是弱关系,就意味着两者不可同真,也就意味着,当r7c3(7)为真的时候,r2c3(5)就必然为假。这样就可以说明当r7c3 = 7时,r2c3 <> 5了。

确实我们有r7c3(7)-r2c3(5)。因为它们同真时,观察c3,针对于4、6、7来说,数字6就无位置可填了,就这样矛盾了。所以弱关系得以成立。

刚才说到了,因为弱关系的缘故,所以r7c3(7)为真的时候,确实可以确定,r2c3 <> 5。所以,因为这样的缘故,本应该产生的467隐性三数组也可以删掉r2c3(5),所以r2c3 <> 5也是结论的一部分。

这条链的删数结论的说明甚至用到了隐性毛刺数组才得以解释,像这样的链结构,不能直接得到全部删数的链,则可以称为一种间接删数的链。

至此,ALS的内容就全部结束了。可以看到,ALS的例子非常有趣,而且灵活。在我们平时运用和观察之中,将变得非常有用处。


第 35 讲:毛刺数组的评论 (共 条)

分享到微博请遵守国家法律