第 43 讲:动态链
如果说强制链是链的一种推广形式的话,那么现在要讲到的动态链(Dynamic Chain)就是另外一个层面的链的推广。
动态链强调链可以包含不同的分支,并且分支能够进行汇总,得到想要的结果。这种链可以依赖于AIC,即强关系开头、强关系结尾,并且强弱关系交替进行的链。
Part 1 动态链是怎么运作的?
1-1 一则示例

如图所示,我们假设r4c2(1)为假,则可以得到r6c3(1)为真。此时我们走两个分支方向:
方向1:由于r6c3(1)真,所以r2c3(1)为假,r2c3(9)为真,可以得到r2c6(9)为假。
方向2:由于r6c3(1)真,所以r6c3(9)为假,所以r6c7(9)为真,r1c7(9)假,r3c8(9)真,r3c6(9)假。
由于分支起头都是r3c6(1)为真,所以不论走哪个分支,最终的结果也应当是同时成立的。所以此时应当由r2c6(9)和r3c6(9)同时为假。所以此时c6只有一处可以填入9,即r4c6,所以城之内r4c6 = 9。所以此时链从r4c2(1)为假得到了r4c6(9)为真,故视作不连续环处理,删除两端的交集,即r4c2(9)。
这条链在中途某处出现两个分支方向,并最终通过同时成立的结果来进行归并,并得到最终的结果。我们称带有不同分支的标准链为动态标准链(简称动态链,Dynamic AIC)。当然,强制链分身就带有分支,所以强制链单独有特殊的规定:如果强制链的某个分支上含有不同的分支,此时我们称整个强制链为动态强制链(Dynamic Forcing Chain)。由于动态强制链比强制链更为暴力,所以此处我们就不再举例说明,它的逻辑和动态链其实是完全一样的效果。
和不连续环一样,它的首尾也是不连续环的删数模式,所以这个链称为动态不连续环(Dynamic Discontinuous Loop),注意,此处不应书写Nice一词。Nice是否应该书写将在后面进行讨论。
1-2 文本表达
和AIC一样,动态链依然需要文本的表述格式。不过由于动态链带有分支,所以我们将从分支处用冒号起头,并把每个分支单独换行书写。例如上面的示例的链的表达是
这种格式的书写方法依赖于换行和缩进。如果在不合适的地方多写了缩进,或者是本应该缩进的地方没有缩进,就无法直接判断链的该部分是否应在主线上。
还有一点要注意的是,每行结尾处必须标注出节点涉及的候选数,不能够省略,因为换行后可能为分支路线,我们不能保证它在还原时,应还原为具体是哪一个分支的开头节点的涉及候选数。
另外,由于r2c6(9)和r3c6(9)两个分支的末端是弱关系,所以归并的时候,我们将继续使用强关系,故r4c6(9)应用强关系连接。这也是符合链的规则的。
Part 2 嵌套结构的动态链
2-1 嵌套ALS的动态链

如图所示,这条链有点小绕。
链的表示如下:
逻辑是这样的:由于链的起始需要设为假,所以设r3c1(3)为假,则同时可以得到r2c2(3)和r3c8(3)为真。两端引出两条不同的链后,分别得到r4c5(4)和r4c8(3)为假,所以r4c1(1)此时必然应为真。所以r3c1(3)为假时,r4c1(1)应为真,所以r3c1(3)和r4c1(1)至少一个为真,按照不连续环的逻辑,删掉r3c1(1)。
有点疑问。观察r4,r4有多个单元格涂色,但显然不是ALS,因为数一下单元格数和候选数种类数,发现是相差2而不是相差1的。
那么,你这么理解一下:r3c1(3)为假时,r2c2(3)和r3c8(3)同时为真。r2c2(3)引出的链得到了r4c5(4)为假,而r3c8(3)引出的链得到了r4c8(3)为假。这也就意味着,r3c1(3)为假时,可以得到r4c5(4)和r4c8(3)同为假。如果此时r4c1(1)也为假,就意味着这三个数同为假,然后涂色的四格,就都只有2、5、8三种候选数,这显然是不够填的,所以r4c1(1)此时只能为真。所以它是强关系。
注意一点,这里是r4c5(4)和r4c8(3)同为假,如果写成{r4c5(4), r4c8(3)}的话就要注意里面两数是同假的,不要把逻辑搞错,然后推导走向了另外一个错误的方向。比如之前有人就问我,“r4c5(4)和r4c8(3)这个整体节点为假,应该是破坏‘r4c5(4)和r4c8(3)同时为真’的情况,所以应该是r4c5(4)和r4c8(3)最多有一个为真的意思”。这个说法是错的,因为同为真和同为假并不是对立的。
最后告诉大家,这里嵌入了一个四个单元格,但内部有六种数字的结构。它实际被叫做二次待定数组(Almost ALS,简称AALS或ALS),就是ALS的待定版本。之前没有讲它的原因是这个叫做AALS的东西一般不在实战里面出现,或者出现频率极少,而且不好观察到。
2-2 嵌套AUR的动态链

如图所示,这个链厉害就厉害在它带有一个AUR。链的表达如下。
可以看到,这个链在表达上也挺别扭的。假设r7c4 <> 6,可以一直到r1c6(9),此时它为假。
当r1c6(9)为假的时候,r1c468(46789)这个AALS区域里就变为了ALS,因为少了一个数,不过依然不能直接用。此时我们将分两个分支讨论。
走分支1,可以得到r1c4 = 6的结果,到这里就结束了,我们就不再向下走了;
走分支2,可以得到r1c8 = 7的结果,然后继续向下得到r5c8 <> 7、r5c9 = 7。此时我们这么看。由于r5c9(7)为真,所以我们不妨把r5c9(69)看作整体,它们均为假,所以类似于区块来说,它们实际上整体节点就是为假的。接着我们发现,如果r5c9(69)和r7c4(6)同假的话,就会使得r57上的所有6和7都将只能放在r57c23里,使得四个单元格变为6和7的隐性数对,并去掉其它的数字,也是就形成了UR的致命形式,所以出错了。故它们不同假,即r5c9(69)=r7c4(6)是成立的。
不论分支多少成立,我们能保证其中至少有一个分支是对的路线。至于为什么说是至少而不是有且仅有呢,因为在我们推理的过程里的每一个节点都不一定仅通过这一条路径得到结论,它们仅仅是建立在假设成立的前提下可以得到这样的结果罢了,所以其它的情况我们并不清楚。所以至少有一个分支成立,那么结果里至少有一个是对的,即r1c4(6)和r7c4(6)里有一个是对的,所以删除它们的交集,即c4上的其余位置的6。
此时请注意,我们还漏掉一个情况,就是链头r7c4(6)本身成立的情况,但这一点恰好在其中的一条分支上出现了,所以我们不必讨论它,但从严谨和客观的角度出发,实际上应当是取r1c4(6)、r7c4(6)和r7c4(6)的交集,即两个r7c4(6),一个表示分支上的节点,而另外一个则表示链头。
这种“一个头两个尾”的结构有时候被称为多头链(Multi-way Chain)。
我们再来看一则示例,不过这则示例需要你自己推理其逻辑。如图所示。

Part 3 一些常见的动态链定式技巧
接下来我们来看一些基于动态链的定式技巧。
3-1 三国争雄
第一个技巧的名字很霸气,而且示例也很新奇。

如图所示,它实际上是“三个头”的W-Wing结构。由于W-Wing的头尾都是一样的形式,所以此处我们随意找一个“头”作为链头开始推导。
假设r4c3(6)为假,则r4c3(9)真,r9c3(9)假。此时可以发现r9还剩两个9,我们分情况进行讨论:假设r9c4(9)是成立的,那么向上推导能够得到r3c4(6)为真;但如果假设r9c6(9)成立的话,那么向上推导可以得到r6c6(6)为真。
所以实际上这个问题被转化为了前一节讲到的三头链问题了,删数是删它们的交集,即r4c3(6)、r3c4(6)和r6c6(6)的交集,即r4c4(6)。
这个技巧被叫做三国争雄(W-Wing Three Kingdoms)。
3-2 毛刺链

如图所示。链表示如下:
这条链的删数逻辑是,观察r4c5(6),设它为真时,可以删除r9c5(6);设它为假时,引出链,以r9c5(2)起头,得到r7c6(6)为真,依然可以删除r9c5(6)。所以r9c5(6)可以删除。
这个结构叫做毛刺链(Kraken Region | Cell)。
Part 4 动态链的逆向视角
可以看到,动态链是具有分支的,那么既然有分支,就逃避不了一个问题,如何逆向思考动态链的逻辑。
实际上,动态链的逆向视角采用的是逆否命题来得到。我们先思考,动态链分哪些情况。实际上,动态链之分两种:有一种是内部有分支,但最终汇总了;还有一种是没有汇总,形成了多头链。第一种链实际上逆否不会影响到中间的推导逻辑,因为链的本质是看头尾的删数交集,而中间在删数层面是不关心的(当然,环除外)。所以第一种情况我们不需要细致的说明。而第二种不同,它是多个头,这就得分方向了。那么我们简单来使用数理逻辑的语言证明一下。
假设这个三头链,链头有一个,链尾有两个。那么它的逻辑是“如果链头为假,则两个链尾至少有一个为真,则删除它们三个端点的交集”。
那么,如果这个链逆向推导呢,逻辑又是如何的?先用逻辑语言把叙述改一下。先设“链头为真”叫A,“第一个链尾为真”叫B,“第二个链尾为真”叫C。则叙述应该是这样:
若非A,则B或C。
将链逆向,则就是逆否命题,即
若非(B或C),则A。
然后,借用德·摩根律拆开括号。
若非B且非C,则A。
转为自然语言,就是两个链尾同时为假时,得到链头为真时,则可以删除它们三个端点的交集。那么,更多情况可以自己试试看,实际上逻辑和推导方式完全和上面的一样。这里就不再讲解了。