第 46 讲:毛刺、毛边
为了解决强制链观察困难和逻辑死板的特殊情况,我们发明了一种技巧,叫做毛刺(Burr Logic)和毛边(Bi-burr Logic)。
本文的概念毛刺和毛边都是由来自中国的数独玩家“探长”(网名,Borescoper)发现和命名。因为技巧非常实用,因此本文的相关内容对于平时做难题来说都显得非常重要,因此是一个相当有意义的一大数独思维方式。
Part 1 毛刺的定义
先来说说毛刺。毛刺是一些难题技巧里必不可少的包装技巧,它能够把一部分强制链改写为比较优雅的格式,而且逻辑更清晰、做题更容易观察。
我们来看看毛刺到底是如何工作的。
1-1 第一种毛刺用法


如左图所示,我们发现r3c789里,如果没有这个多余的r3c9(7),三个单元格将变为一个三数组,那么所在的宫和行上的其余2、5、6都可以被删除。
但可恨的地方就是r3c9(7)是客观存在的,所以我们不能使用这个结论。那么我们就不得不找出一条强制链,来消掉对7的影响,而且还能找到和之前删数一样(或者大部分一样)的结论。
幸运的是,我们发现,当r3c9(7)为真时,此时r6c9(7)为假,于是产生了一个XY-Wing结构,使得它能删除r23c9(6);而在之前的三数组里,我们确实也能删除r2c9(6),所以,r2c9(6)便是这个技巧的结论。如图所示。

这就是毛刺的基本使用方式:当我们发现一个结构多余了一个数或多个数的时候,我们想方设法把它(或它们)看作一个节点,以它为起点,作出一条强制链,沿途产生的所有强关系都是可以直接运用到结论里的。
当然,这个题只有一个弱关系,接了一个XY-Wing后,我们利用了XY-Wing的构造,产生了首尾的强关系,于是便有了删数。这就是我们上一段文字里说到的“沿途产生的强关系”。不过这个例子只有这一个强关系,所以找到的删数只有一处。有一些示例里的删数比较多,它便使用了更多的强制链沿途产生的强关系。
当然,毛刺结构是可以转为链的写法的,例如这个示例,我们可以将它记作
不过,因为结构被嵌入链里,所以最好带上结构名来区分结构是什么。当然,最后的XY-Wing,我们需要的仅仅是那一条强关系,所以我们甚至可以改写为
这和之前的毛刺转ALS一样,也被称为解构(Deconstruct)。当然,区块三数组也可以解构:
另外,我们称这个多余的数字为毛刺(Burr)。例如这个示例里的r3c9(7)就是整个结构的毛刺。
如果你没有看过瘾,我们再来看一则使用示例。


如左图所示,如果r23c1(9)为假,则我们尝试假设此时r3c6(4)为假,则r23c4一定含有数字4,且r23c1是4、6数对,那么此时,如果r23c4(1)和r3c8(1)同假的话,r23c148将会构成关于2、4、6的拓展矩形的致命形式。为了规避该致命形式的产生,我们不得不设定r23c4=r3c8(1)关系成立,且该强关系产生于r3c6(4)为假的时候。于是顺次推导,并可以得到r3c9 = 9的结果,此时可以去掉r3c6(9);但如右图所示,如果r23c1(9)为真,则r46c1(9)同时为假,此时r46c16将形成关于4和5的共轭对类型的UR结构。于是此时r46c6(4)必须为假,所以r3c6(4)为真,此时一样可以删除r3c6(9)。
由于两种情况均可以得到一样的结论,所以r3c6 <> 9必然成立。
注意右图中的某个箭头上,有一个波浪符号“~”,它用来表示左侧节点为假时得到右侧节点也为假的逻辑。同理,实线箭头上方带有一个波浪符号表示左侧节点为真时得到右侧节点也为真的逻辑。这个标注模式是之前从未提到过的,这里需要你注意一下。在后面的内容里我们也会使用这样的写法,并也在附录里给出了这样的标注习惯的意思。
1-2 第二种毛刺用法
实际上,毛刺的用法还不止这一种,因为它用于链里,如果我们把它放在数组(或伪数组)里,会怎么样呢?


如左图所示,我们找到了一个假的伪数组,之所以说它是假的伪数组,是因为它的内部有3、4都可以跨区。我们一般认为的伪数组只能有一个数字可以跨区,这样我们才能找到适合的结论,而这个结构有3和4都可以跨区,那么我们只能去讨论跨区的最终情况了。
我们拿数字4来讨论,如果数字4不跨区的话,那么例子里只有3可以跨区,而结构涉及的4个单元格里恰好只有3、4、6、9四种数字,所以我们可以利用伪数组的结果直接得到,这三个3的交集就是删数,例如图中的r8c46和r9c4,都处于这个交集上(当然,图里只标了一个结论删数,所以其它的都没标)。
接着看右图。当数字4跨区的话,显然只能把它们放到r7c8和r9c5上才可以实现跨区。所以放上去后,我们可以发现到一个强制UR结构:r39c45(34)。由于其中的一个单元格已经被我们刚才的假定前提4给覆盖了,所以我们基于这一点,可以发现r9c4如果填入3的话,这四个单元格就只能放3和4:首先我们通过r9c4(3)得到r3c4(4)为真(双值格);然后由于r3存在3的共轭对,所以r3c5(3)必须为真,此时四个单元格只有3和4了。由于全部只能放下3和4,所以形成了致命形式,故假设不成立,即r9c4 <> 3。
而在第一种情况下(不跨区),r9c4(3)依然是可以删除的,所以r9c4 <> 3即为结论。
这则示例看起来好像跟毛刺没有什么关系,因为毛刺是结构本身多出来一坨东西,但实际上,我们可以按照r9c5(4)是否成立来进行讨论,并基于伪数组这一点来产生不同的讨论情况。
毛刺的两种用法就说完了,接下来我们来看一些其它的经典示例。
Part 2 链列的毛刺用途
2-1 链鱼
链鱼(也叫链链列、远程鳍链列、远程鳍鱼,Kraken Fish,由于属于鱼的构造,所以也可以简记为鱼+或链列+)是Hodoku里规定的一种技巧,在结构里存在一个鱼鳍,不过这个鱼鳍不像是之前的鱼鳍一般可以直接对应删数,而是添加一条链来得到删数。


如左图所示,假设r3c2(4)不存在,则X-Wing在r39上作为定义域是成立的。所以删除域上的4全部都可以删。不过由于r3c2(4)客观存在的缘故,我们只能把它作为毛刺进行讨论。
假设r3c2 <> 4显然可以删数;而r3c2 = 4时,我们可以找到一条强制链:r3c2(4-9)=r3c7-r12c9(9=4)。由于沿途的所有强关系都可以使用,所以我们依次来寻找强关系末端的结果是否可以对应到删数上。
首先是r3c7(9),当它为真时,原本的删数都是4,跟9无关,所以这个强关系没有删数;接着是r12c9(4),可以看到此时我们可以发现r12c9(4)可以对应删数r1c7(4),所以r1c7 <> 4便是这个结构的结果。
当然,很显然的是,毛刺可以写成一条普通的链,所以这个示例可以把它写成一条普通的链:
这样写的好处是可以更直观地把结构用链表达出来。不过,我们就需要介绍一种新的节点类型:X-Wing(以及更大型的链列结构)。这则示例是链鱼的第一种类型。
在讲第二种类型之前,我们先要处理一个遗留的问题:X-Wing作为节点是什么样的东西。
2-2 对X-Wing节点的讨论
和之前介绍过的节点类型不同的是,X-Wing的结构非常大,这使得我们在讨论真假的时候,不得不思考如何去放置这些数字。
首先,考虑一下X-Wing节点为真的情况。

如图所示。显然X-Wing节点为真,就意味着对角线两端的两个单元格(左上r3c3和右下r7c7,或者是右上r3c7和左下r7c3)两处的填数模式是一样的,即有两个位置要填这个数1,而两个位置不填这个数1。
那么X-Wing节点为假则是这个说法的对立面。X-Wing一共涉及四个节点,所以严谨的方式是,我们需要讨论的情况有如下五种:
节点里有4个单元格都填这个数;
节点里有3个单元格都填这个数;
节点里有2个单元格都填这个数;
节点里有1个单元格都填这个数;
节点里有0个单元格都填这个数(即没有位置放这个数)。
别怕,讨论的情况看起来很多,但实际上很多情况是完全不可能出现的。显然,X-Wing里完全不可能出现3、4个节点都填这个数字的情况;而一下我们就排除了近一半的情况;而填入2个显然也不可能,因为怎么放置2个,只要放置的位置合理不产生违背数独规则的东西,都是X-Wing为真的情况,而我们要讨论X-Wing为假,所以它不属于这种情况。
所以一下我们就只剩下两种情况了。思考一下,X-Wing可能存在“有0个单元格填这个数”的可能吗?如果你说是,那么你就错了。由于鱼鳍的存在,那么鱼鳍必然只会存在在定义域上,而只有一个鱼鳍的情况显然是不可能出现在两个定义域区域上的。如果没有位置填这个数,这就会使得有一个定义域区域下放不下这个数字。比如上图里,定义域我们人为固定为r37,假设鱼鳍在r3上,那么如果属于“有0个填入”的情况的话,r7就无法找到合适的位置能够放下1了,因为r37是定义域,定义域规定了结构必须产生于这些区域,即区域里必须至少有一个位置是放这个数的。
所以,在五种情况里,只有一种情况是符合X-Wing为假的,那就是“四个节点里有一个放这个数”,而这个数还必须位于刚才我们说到的、鱼鳍不在的定义域区域上。所以综上所述,我们就讨论了X-Wing节点真假的情况了:
X-Wing节点为真:恰有两处对角位置上填入这个数字;
X-Wing节点为假:有且仅有一处位置可以填入这个数字。
那么我们再次回到原来的题目上去理解。

如图所示。我们率先就得假设X-Wing节点(r39c37(4))为假(图上没有画出X-Wing整体)。显然,当X-Wing节点为假时,只有r9c37里有一处是4,而r3c37里都不能是4,也因此我们确定了r3c2是4。因为它是r3上的鱼鳍,r3只有r3c237三处可以填入4,现在X-Wing节点规定r3c37(4)都为假了,显然只有r3c2(4)为真了。所以,X-Wing节点为假后,得到了r3c2(4)为真,于是链得以往下继续理解。
X-Wing节点的逻辑就讨论完了。那么剑鱼(三链列)和水母(四链列)呢?虽然结构更大,但讨论逻辑依旧完全一样,首先我们可以得到的是,三链列最多占据9个单元格,而三个定义域上最多只允许我们能放下3处链列涉及的这个候选数,所以4到9的情况完全不用我们考虑,因为这样必然是有重复的,所以问题直接简化到讨论0到3个位置填数的情况;同理,四链列也是一样,最多我们也只需要讨论的是0到4个位置填数的情况。
不过,实际上,管它填多少个,你都会发现,在节点为假时,填数位置一定不会出现在鱼鳍所处的定义域区域下。这便有了我们上面那样的结果。所以,不论链列的规格是多大的,我们总能得到相似的结论,这便是链列这个东西神奇的地方所在。
另外,可以从图上看到,前面的例子里毛刺的讨论过程跟鱼鳍完全一样,它们唯一的差别是,鱼鳍可以直接对应删数,而毛刺不能。实际上,鱼鳍和毛刺是一样的东西,毛刺由中国的数独玩家探长(昵称)发现,并由他命名了这个技巧。从他本人口中得到的是,毛刺应当和鱼鳍是一样的,只是使用场合不同:鱼鳍一般用于鱼(链列)结构,而毛刺则针对于其它的非鱼(链列)技巧。
2-3 链鱼的推广
接下来我们来看一下链鱼结构的推广,到底该怎么用。

如图所示,我们可以看到一个链列结构,不过它带有一个鱼鳍,而删数却跟鱼的涉及数值完全不一样。我们来看一下,我们如何运用这个鱼结构。


如左图所示,链表述如下:
这条链以弱关系开头了,显然用了强制链的思想。逻辑是这样的:当r4c5(5)鳍为真时,r8c3(7)为真。很显然,r8c3(7)为真了,自然r8c3(1)为假。
而如右图所示,链表述如下:
那这条链想说明什么呢?如果r4c5(5)鳍为假时,r8c3照样不为1。首先观察到r8c3(7)为链头,引出一条区块不连续环,直至r45c3(1),这样就可以删除r8c3(1)了。但是有一个小问题,c6(5)并不是强关系。那为什么用强关系了呢?
因为这是一个鳍为假的二链列。当这个鳍为假时,它就是毫无瑕疵的二链列结构了,而之前环结构一章里,二链列结构可以被看作环的形式,而弱关系下的所有数字可删,从而把弱关系改变为强关系的形式。这里就是利用了这一点:鳍为假,二链列成立,二链列又是一个环,所以所有二链列内的弱关系均可被看成强关系使用,所以这才成立的。只是要注意一点,这只是鳍为假时,才成立,并不是所有情况下都成立,别忘了这个大前提。
然后按照这个区块不连续环的逻辑,当鳍为假,链结构成立,并最终得到了r45c3(1)为真的结论,所以此时r8c3(1)照样为假。那么,不论鳍的真假,r8c3(1)都可以删除。所以r8c3 <> 1。
2-4 节点重叠的链鱼

如图所示,链表述如下:
那么简单叙述一下它的逻辑:当r1c6(7)为假时,顺次得到r7c6(7)真、r7c6(4)假、r5c6(4)真、r5c6(3)假、r5c2(3)真、r2c2(3)假,然后b1内产生36隐性数对,所以r23c3(36)隐性数对为真,r23c3(7)均为假。然后,因r23c3(7)均为假,所以观察c36(7),二链列结构成立。
所以最终链的删数为r1c6(7)和r17c36(7)的交集。r1c6(7)和r17c36(7)都能删除的是r1其余位置的候选数7,所以r1c9 <> 7。
这个是单候选数和二链列的节点重叠结构。
2-5 四个鱼鳍的三头链

如图所示,链表述如下:
首先,{r8c7, r9c8}(49)的毛刺显性数对为假时,r8c7(6)为真(之前说明过这一点,这里不再赘述)。然后当r8c7(6)为真时,r17c27(6)的二链列结构(如果暂时先不看r1c5、r7c459这四个鱼鳍的话)必然无法成立。因为r8c7(6)为真必然会排除二链列结构同一列上的两处填数位置,二链列必然是对角两格同时为真的,这样一排除必然导致无法这么去填数,从而形成弱关系。那么,当二链列结构为假时,那只可能让鱼鳍至少其一为真了。此时分两路观察。
如果r7c9(6)为真,那比必然r7c9(9)为假;而如果剩下三个鱼鳍至少一个为真的话,都会使得r9c5(6)为假,于是观察r9c58这个nALS区域,最终得到r9c8(9)为真。这样的话,r7c9(9)也应为假。
这样就有两个链尾。这是一个三端点链。而链头则是{r8c7, r9c8}(49)的毛刺显性数对,而它照样是可以删除r7c9(9)的,所以r7c9 <> 9。
这个例子比较麻烦的是,它带有四个鱼鳍,但实际上我们在使用的时候还是当作一个整体使用的。
Part 3 毛刺SDC


如左图所示,如果我们尝试去掉r5c8(2),那么r4c3和r5c128四个单元格将构成SDC结构,所以可以删的数字全部已经标注了出来。
不过,因为它是客观存在的,所以我们视作毛刺,假设为真并讨论其逻辑,此时就会引出一条动态强制链,并走了两个分支。一个分支将走向r5c1(5),而另外一个分支则走向了r4c456(4)。显然,它们都是通过毛刺r5c1(5)为真得到的,所以它们将同时成立,故删数就是这些4和5,和左图删数的交集,即r5c46(4)和r5c49(5)。
Part 4 毛刺环
4-1 环 + 双RCC的ALS-XZ


如左图所示,我们尝试把r4c2(3)看作毛刺,假设为假的话,r34c24将会构成一个双RCC的ALS-XZ,当然它也算一个普通的环结构,不过删数理解起来也和之前的方式一样:首先删除弱关系的交集,然后再来看ALS区域涉及的数字,组成数组,删除交集。所以左图的所有删数我们都使用了红色标注出来了。
再看右图,当r4c2(3)为真的时候,我们不得不讨论真的时候的情况,此时,我们利用r4c2(3)为真的特性,向下排除,得到r9c2 <> 3,此时,右图给出嵌套ALS结构的环就成立了,删数也全部都标注出来了。
可以从示例里面看到,它们两个环的删数是有部分相同的,所以我们取出相同部分(深红色),就是这个毛刺环结构的删数了。
可能你会问我,到底这里说的毛刺环指的是左边还是右边的环。实际上都可以,这一点并不重要,不过我更喜欢称呼的毛刺环指的是右边这个,因为右边毛刺为真的时候得到的结果,作为强调来说,确实右侧的重要性更大。
4-2 环 + ALP
下面要讲到的例子是最后一个毛刺的示例,不过示例非常精彩,而且富有挑战性。


如左图所示,我们尝试把r13c2(1)看作毛刺的话,那么就会产生这样的一个环:
可以看到,把以前学到的所有知识点代入,可以理解到大部分的逻辑,但r2c7(1)-r2c4(5)是很难立刻明白原因的,你可以尝试想想看,如果你能独立明白它,那么恭喜你,你对以前的知识已经真正做到了灵活运用。如果没有,也没有关系,下面我们我们来讲解一下左图这个弱关系到底是怎么产生的。
首先,我们要明白链的基本构造原理是基于头尾至少有一个为真,形成强关系的。所以图上我们可以率先得到r2c4(5)和r2c7(1)不同假,即至少有一个为真。那么我们就不妨考虑一下这两个节点的真假情况。
如果两个节点同真,则观察b1,由于毛刺此时假设为假,所以放下1的位置只有r1c1这一处,而5本身也只有r1c1一处位置。说白了,1和5此时被压在r1c1里。显然两个单元格是无法填入一个数字的,所以出现矛盾,故两个节点不同真。
但是,两个节点一共只有四种组合:真真、真假、假真、假假。显然假假不允许(强关系定义不同假),真真也不允许(刚才证明得到1和5无法放进去)。所以,只有两种情况,即一真一假。既然是一真一假,那么会发生什么事情呢?
第一,这两个节点可以形成弱关系了。因为两个节点的关系是一真一假,既然是一真一假,那么这种情况就既满足强关系的定义,也满足弱关系的定义(一真一假的情况恰好处于两个定义的交集上),所以两个节点的关系既可以按强关系处理,也可以按弱关系处理。而此时,我们当然喜欢让结构更完美,即环比链更好(删数更多),所以我们会优先将其当作弱关系处理,所以弱关系就成立了。待会儿我们还会用到这个弱关系。
第二,会让涂色的五个单元格{r1c1, r2c1347}构成关于1和5的欠一数对结构(ALP)。这一点很神奇,可事实确实如此。不论r2c4(5)为真,还说r2c7(1)为真,我们都可以确定b1里能放下1和5的位置都只能放在r1c1里,所以r1c1实际上只能放1和5,也因此,欠一数对就成立了。
既然得到了两个结论,那么环的删数就很明确了:首先是我们之前知识能够删除的地方:r1c7(24)、r467c8(9)。那么r1c1(24)和r2c5(1)则是由于刚才的欠一数对成立时,产生的删数(欠一数对成立会同时使得b1和c2上产生1、5的待定的显性数对),所以删除其余位置的1和5。当然,就b1而言,r1c1只能填入1和5,所以2和4当然就删掉了。所以总的来说,第一个图能得到这样的结论。
我们再来看右图。右图看起来特别复杂,但实际上我们只要掌握一点就好:当毛刺引入强制链(即设为真)的情况时,我们只需要找出所有强关系处能对应到的删数,而且这个删数在原情况(毛刺设为假)时是可以删掉的的话,那就可以作为整个技巧的删数结论了。所以,我们就来尝试找出结果。我们引入了一个动态强制链,下面简单叙述一下路径。首先从毛刺r13c2(1)为真出发,得r4c2(1)假、r4c2(3)真、r4c89(3)假、r45c9(3)真。此时分两个分支走向:第一个分支是走上面r23c9(3)假、r23c9(47)毛刺显性数对真结束;第二个分支则是走下面r5c9(5)假、r6c8(5)真、r9c8(5)假、r9c8(9)真、r1c8(9)假。此时走两个分支方向:由于r1c8(9)假的缘故,所以b1存在ALS区域,使得r1c8(9)=r2c7(1)成立;走另外一个方向则是r1c8(9)假的缘故,只得使r1c8(2)真(双值格)。于是,我们在路径上分别得到了r1c8(2)真、r2c7(1)真、r23c9(47)毛刺数对真、r9c8(9)真,所以它们对应到的删数r1c1(2)、r1c7(24)、r467c8(9)都是这个动态强制链路径上能排除的数字情况。而对应左图,只有r1c1(4)不能删,其它的数字全部能删。所以,整个技巧里,除了r1c1(4)不可以删以外,右图里的所有删数全部都可以作为结论成立。即,整个题目的删数如下图所示。

Part 5 毛边的定义
如果毛刺是“技巧 + 1”的话,那么毛边则是“技巧 + 2”。看起来差别不大,但实际上在使用过程之中,我们并非是将这两个特殊的部分作为强制链的形式进行挨个讨论的,而是构成强弱关系来讨论。
5-1 强毛边


如左图所示,可以看到,在c24上一共有6个1。如果我们把r2c2(1)和r4c4(1)抛开不算的话,恰好就构成了一个二链列结构。但是由于客观的存在,导致我们没办法使用这个技巧,所以我们只能加入链的思维。
此时由于是两个毛刺,所以我们不得不分四种情况讨论:真真、真假、假真、假假。虽然看起来很多,但实际上我们依旧可以简化逻辑。首先,它们同为假的时候,二链列的结构就成立了,所以我们把它单独算成一种情况;而剩下三种,我们可以发现,真真、真假、假真这三种情况可以直接一并称为“不同假”。而不同假即为强关系,所以我们还有一种情况,就是直接把它们用强关系相连,接着就有了右图这样的不连续环结构:r5c7(1)=r5c2-r9c2(2)=r89c2-r2c2=r4c4-r4c9=r5c7(1)。可以看到,这个结论可以直接得到r5c7 = 1的结果,而原来的二链列可以删除r5c7(1)对应到的r9c7(1),所以,r9c7(1)即该技巧的结论。
可以发现,这一则示例我们利用了四种情况来简化为两种:同假形成结构和强关系。这种构造形式我们就称为毛边(Bi-burr),可以从英文名发现,它就是两个毛刺(Bi-前缀加上burr)。“边”暗示两个节点连接在一起形成链结构的一条边。
可以从示例所分的四种情况里发现,既然我们可以划分为强关系和同假,那么是否也可以划分为弱关系和同真呢?答案是肯定的,因为弱关系对应不同真,而恰好跟同真是互斥的情况。
5-2 弱毛边


如左图所示,如果我们假设r4c2(1)和r6c7(1)同真和不同真,会怎么样呢?假设它们不同真,我们首先可以得到的结果是,不论是同假也好还是有一个填入也好,我们都有r4c2(7)=r6c7(6),说明这一点也很简单:当两个1同假时,它们就直接填进去了,显然不同假,所以这个强关系成立;如果有一个为真,则另外一个单元格必须填入6或者7这个数字,这便使得两个单元格的6和7不同假了,所以依然是强关系。于是,我们利用上这个强关系,我们可以寻找到一个连续环结构。
不过有一个问题。我们这个例子在讲弱毛边,显然应当是同真和不同真的情况,但是左图却用的是强关系(即不同假)。不同假和同真并非是互斥的,所以我们证明思路是否出现了问题和漏洞呢?其实不然。这一点就得用到环的特性了。之前环里有一个特殊的特性,环内的任意关系都可以切换,即强关系可以视为弱关系;而弱关系则可以视为强关系。既然环内的任意相邻两个节点都是一真一假的话,那么显然我们就可以把这里r4c2(1)和r6c7(1)作为弱关系来看待。所以实际上并没有出现问题。
接着我们来看右图。由于左图我们是当作不同真处理了,所以右图必须是同真的情况。可以看到,当两个1同真后,对r7排除,就可以得到r7c27(1)为假的结果,于是我们就有了r7c27(1)=r7c7(9)的强关系。接着向上连接,最终可以得到r2c9(7)为真。所以实际上,这个例子我们可以通过r4c2(1)和r6c7(1)同真而得到r2c9(7)为真。
可是例子删什么数字呢?左图是一个环,可以删除的是两个数字:r2c2(7)和r8c7(6),而在右图我们得到了r2c9(7)为真的结果,所以r2c2(7)和它是同行的,所以可以删除掉,而r8c7(6)就不行了。所以这个例子最终可以删除的数字只有r2c2(7)。
你也别小看了它,因为这个题目就这一个技巧就可以破解。
可以发现,弱毛边和强毛边的使用有一点点小的区别是,弱毛边在处理同真的情况的时候,我们利用的方式一般有两种:一种是通过像上图这样的排除,进而得到想要的强关系;而另外一种则是通过结构的占位来得到强关系。所以弱毛边用起来比强毛边更灵活。
接下来我们再来看看一些特殊的结构或技巧都如何利用毛边进行解题。
Part 6 一些常见技巧里的毛边
6-1 BUG + 3


如图所示,这是一个BUG + 3结构,其中三个真数分别是r2c9(4)、r7c9(8)和r9c6(4)。为了好用毛边结构,我们将两个4作为毛边来看待,并使用强毛边来推导。
假设r2c9(4)和r9c6(4)同假,则由于BUG + n要求所有真数不同假,所以只得让r7r9(8)为真,于是引出一条强制链,得到r7c2(4)为真,所以此时可以删除r7c6(4)。
接着我们假设r2c9(4)和r9c6(4)不同假,则它们形成强关系,于是可以看到一个环结构,依然可以得到删数r7c6(4)。
所以不论哪种情况都可以删除r7c6(4),所以它就是这个技巧的结论。
6-2 XR + 3

如图所示,如果r5c6(9)为真,则直接可以删除r2c6(9);当它为假的时候,我们就引出了一条毛边r3c4(6)=r8c6(1),按照图上给出的方向进行推理,最终我们就可以得到删数结果。需要阐述的地方是上面的ALS区域和假SDC区域。
ALS区域里,如果给出的5和6同真,则会导致ALS区域没有5和6,致使填数少掉两种,2、7、9又无法填满四个单元格,导致出错。当然,这里你也可以看互补的视角:r2无法填入6(1、3、4、8是确定值,而原视角涉及的是2、7、9,所以互补视角只涉及5和6,而5把6该填的位置占了);而假SDC区域里,如果5和9同假,则会使得区域里只有3和6,且都不跨区,所以填数一定不相同,而三个单元格必须要填入三种不同的数字,而此处只剩下3和6两种数字可填,所以产生了矛盾。
当然,这个例子你也可以叫毛刺,如果你强调的是r5c6(9)的真假讨论的话。之所以称为毛边,是考虑到拓展矩形的真数的填数情况而设定的。如果同假,则r5c6(9)为真,而如果不同假,就形成强关系。所以其实这两种说法只是针对的侧重点不同罢了,没有必要纠结。
6-3 毛边对交空矩形
下面我们来看一点精彩的例子:毛边和对交空矩形到底会交织出什么样的逻辑呢?


如左图所示。如果我们尝试让r8c5(8)和r9c9(4)同假,此时我们就可以得到b9的空矩形区域和两个关于4和9的双值格,于是空矩形欠一数对就这样诞生了。所以,r8c2(4)便是此时的删数。注意,这是当r8c5(8)和r9c9(4)同假时才得到的删数,并不是全局的删数。接着,由于r8c2(4)为假,那么由于ALS的关系,r4c2(1)为真。所以,此时可以删除掉r2c2(1)。
接着看右图。由于同假是一种情况,那么反面情况自然就是不同假,即强关系了。所以我们必须利用上r8c5(8)=r9c9(4)。于是我哦们能够找到上图的链结构,注意b3里有一个ALS区域。
可以看到,不论哪种情况,我们都可以得到r2c2(1)是删数的结论,所以r2c2(1)即为删数。
6-4 毛边环

如图所示,这个例子可能也算毛边里比较难理解的例子了,但逻辑依旧很清晰。如果r9c2(7)为假,则我们可以观察AALS区域{r8c12, r9c2}里,立刻可以找到一个强关系r8c1(1)=r8c2(6),这样我们就可以利用这个强关系,进而形成一个环结构(蓝色的强弱关系画出来的这部分)。
得到这个结构后,我们就得到了环,所以顺带也就得到了这个环的一个删数r7c1(3)。而之前说过,删数和结构是成弱关系的,所以它们可以用弱关系连起来。所以实际上我们开始的这两个强关系大致是这样:设r9c2(7)为假,则r9c2(7)=环结构-r7c1(3)。接着继续向下推导,我们可以得到一条完整的链,一直到r9c4(7)。
这里需要阐述一下r2c4(9)-r9c5(2)。如果它们同真,则c4上2和6将无法填数,因为都被挤入r5c4一个单元格里,显然它们是不能同时填入这个单元格的,所以矛盾。
最后,由于整条链结构(红色)成立,所以删数也就成立了:r9c3(7)。需要注意的是,如果我们把r9c2(7)和r9c5(7)用弱关系连起来的话,那这条链就已经变为了一个完整的环,不过遗憾的是,这个环只有r9c3(7)一个删数,所以我把它画成了链。反正只有一个删数,就没必要画成环了。
Part 7 总结
至此,毛刺毛边的内容就全部结束了,而且,构造也就结束了,而且,链的内容我们就全部讲完了。
可以看到的是,链里给出的所有例子都非常的精彩,而且删数也非常值得去反复推敲,所以在自己做题的时候,希望你们能做到“记、观、用、活”这四个点。
记就是记忆,能记住这些链结构都怎么用,为啥这么用(why),什么时候这么用(when),在哪里可以用(where),如何用(how)。
观就是观察,当我们能够熟练到快速理解和看懂整体逻辑的时候,我们就可以尝试自己去找了。因为熟练看懂逻辑时,你就已经掌握了众多链的使用方式,也就顺带拥有了如何寻找链的一些基础经验,我们就可以通过这些基础经验来寻找链结构。
用就是使用,当能做到观察到后,我们应当学会如何去使用它。这一点不同于观察,使用链和观察链是两回事,当观察到的时候,不一定能找到删数。而且一些环结构,它的删数有时候隐藏得很深(比如嵌入AUR之类的东西)。这个时候就必须得靠自己去逐个验证和得到,然后熟练于心。
活就是灵活,当我们能够做到熟练使用教程文档给出的使用方式后,就可以尝试去找出一些教程里没有给出的强弱关系的证明方式和逻辑。我们在学习这些东西的时候,可以看到技巧是非常多,也非常复杂的。我们在教程文档里不可能也没有必要对每一个类型的技巧都给出一个示例,这样是不现实的,所以在做题的时候,我们利用我们学到的东西,可以得到一些我们学不到的东西,比如我们学习了UR,我们可以将UR同时通过数和形进行拓展,进而得到新的致命结构(这一点将在后面的内容介绍到);又比如我们学习了链的强弱关系的证明方式和过程,它用到了逆否命题,我们就可以通过一些新的东西,比如借助完全不相关的逆命题或否命题来论证一些我们从未尝试过的新的玩意儿;再比如我们学习了链列,我们就可以将它进行推广,放到环里,形成动态环来找删数,实际上链列也是一个环,除了之前我们说到的标准连续环结构,是必须让定义域区域缩减为强关系才能形成,那么一般情况下,它实际上就是一个动态的环结构,而且它的删数就恰好是所有弱关系都可以用到。
这些东西,都不应该全部由我给大家介绍,而是希望大家通过贯穿整个教程,来达到灵活运用的效果。如果你做到了,那么恭喜你,大部分的数独题目都已经对你来说不难了;但是如果你做不到,或者接近于做到,那么也没有必要灰心和难受,成功没有捷径可走,但有工具可以帮你快速到达成功。只要你能灵活掌握,成功就不远了。
下一个部分将为你介绍两种不同于链的包装模式,它们基于共轭对和一些零散的结构。