EH的数独杂谈#3 区块链的玄机

2022/08/26667 浏览攻略
友情提示:
笔者假设你已经充分理解了本系列前面文章的内容,或者通过其他渠道仔细了解过标准链的各种概念。此外,你最好已经充分掌握了所有更加基础的内容,比如区块摒除法,xyz-wing等。
文章中存在大量冗长的论证与定义。如果你在下面的文字中发现了某些没有逗号的长难句,请把阅读速度放慢,必要时请在评论区直接吐槽笔者。
想要直接了解文章结论的读者,可以跳转到最后的部分。
--------
目录
一、以区块为节点的思想
二、从直推看区块的重要性
三、区块节点的扩张与收缩
四、空矩形的深入探讨
五、从区块链看XYZ-Wing
--------
标准链是链的最基本形式。但在实际解题过程中,我们找到的可能会是一些不那么标准的链:
TapTap
链的文字表述是
r2c7(8=5)-r8c7(5=7)-r8c4(7)=r9c4(7-9)=r1c4(9)-r1c78(9)=r3c8(9)
你会注意到,链中出现了一个特殊的东西:r1c78(9)。这个节点不像其他的节点一样只有单独一个候选数,而是包含了一个区域的若干个候选数。该如何理解这一现象呢?
一、以区块为节点的思想
你上一次遇到区块这个词可能是学习区块摒除的时候。相信你们应该比较了解“区块摒除”的推理方法了,不过我们现在尝试从另外的角度理解“区块摒除”这四个字。
以下是区块摒除的两种典型情况。对于图1,考察b1的候选数1,虽然不能确定它会出现在r2c1还是r2c2,但r2的候选数1必定出现在这两格,所以r2c4和r2c6都不能是1。
TapTap
对于图2,考察r3的候选数6,虽然不能确定它会出现在r3c8还是r3c9,但一定保证b3的候选数6只能出现在这两格,所以r1c9和r2c8都不能是6。
TapTap
图1的r2c12和图2的r3c89,我们都可以称之为“区块”。笔者对区块的定义是,区块是用来表示同区的一种候选数所占据的若干单元格的组合。正因如此,该种候选数在这个区块内最多会出现一次。比如图1的r2c1246都是候选数1可以放置的位置,因此任意选择其中的两个,三个甚至全部,把它们当成一个整体来对待,都可以称为关于候选数1的“区块”。
特别地,如果我们有办法证明有的区块“必定”包含该种候选数,那么它就拥有了摒除的能力。对于图1的r2c12是关于1的区块。由于b1内只有这两个单元格可以填1,反过来讲,1在这个区块里必然出现。所以和这个区块同在一行的其余格子,即r2c46的候选数1都可以被摒除。可以看到,“区块”是无处不在的,但只有在确定区块里必定包含该种候选数之后,区块才拥有了“摒除”的能力,“区块摒除”才能作为一个有效的技巧被使用。
按照我前面对于区块的定义,总结出区块的若干性质,后一条更加重要:
①它需要有关于唯一一种候选数,并且组成它们的单元格同区。
②区块内的该种候选数要么只出现一次(包含该候选数),要么根本不会出现(不含该候选数),区块只有这两种状态,非此即彼。所以,在一些情况下,区块可以被当做单独的一个数字来使用。
注意到第二条性质了吗?区块只有两种状态,包含某候选数,或者不含某候选数。恰好标准链的节点也只有两种情况:真(是某候选数),或者假(不是某候选数)。所以我们也可以定义区块“包含某候选数”的状态为真,“不含某候选数”的状态为假。这样,区块可以作为一个普通的节点,在链中正常使用。
--------
如果上述文字存在故弄玄虚,卖弄文字之嫌,那么接下来的介绍会更加实际。
二、从直推看区块的重要性
让我们回到最开始的那个例子:
r2c7(8=5)-r8c7(5=7)-r8c4(7)=r9c4(7-9)=r1c4(9)-r1c78(9)=r3c8(9)
TapTap
如果把链翻译成直推的语言,大概就是:设r2c7(8)为假,则......,则r1c4=9,则r1c7和r1c8都不是9,则r3c8=9。
在推理的过程中,我们发现r1c7和r1c8都不是9。如果把r1c7和r1c8当做一个关于9的区块,那么这个区块就不包含候选数9,也就是区块为假。单纯从链的角度来看,从链头开始按照假真假真......交替,正好到了r1c78(9)的节点是假的。因此,刚才对于区块真假的定义是合乎逻辑的。
但区块的最重要意义还不止于此。如果这条链的链尾是以下两种中的任何一个:
...=r1c4(9)-r1c7(9)=r3c8(9)
...=r1c4(9)-r1c8(9)=r3c8(9)
你会发现无论哪个,最后一条强链都是不正确的,原因你懂的。但把r1c7(9)和r1c8(9)组合成一个区块:
...=r1c4(9)-r1c78(9)=r3c8(9)
最后的强链就完全正确了,因为b3的9肯定得有一个,要么落在r3c8,要么就落在r1c78区块,所以它们肯定至少一个为真。
可以说,区块链帮助我们不通过动态链,简单地表达出一般的标准链难以表述的某些逻辑关系。
三、区块节点的扩张与收缩
现在让我们来观赏一条特殊的区块链。(例子来自向神的标准数独技巧教程,但采用了另一数独软件的UI以便绘画)
TapTap
r8c5(9)=r8c7(9)-r123c7(9)=r1c89(9)
请仔细思考最后的强链是怎么产生的。本例删数是r1c5的9。
这似乎是一个普通的区块链的实例。但我们想讨论的并不只是这些。
考虑下面的情况:
①如果最后一个红圈的区块r1c89发生了扩张(多出一块),原来的结论还成立吗?
TapTap
r8c5(9)=r8c7(9)-r123c7(9)=r1c789(9)
注意到两个区块节点在r1c7发生了重叠。但实际上,这并不影响结论。试想一下:按照上一条链的逻辑,推到最后,r1c89区块为真(即必含有一个9)。那么由于r1c789区块完全包含了r1c89区块,它也为真。实际上,任何完全包含了r1c89的关于9的区块都为真。
②如果在刚才的基础上,最后一个蓝圈的区块r123c7发生了收缩(少了一块),原来的结论还成立吗?
TapTap
r8c5(9)=r8c7(9)-r23c7(9)=r1c789(9)
按照刚才的逻辑,既然r123c7区块为假(即不包含9),那么从里面提取出的小区块r23c7肯定也不含9。实际上,任何从r123c7区块中提取的子区块都是假的。
综上可以得出关于链节点扩张与收缩的结论:真区块扩张后仍为真,假区块收缩后仍为假。当然,对于只涉及单个候选数的真节点,也可以扩张为区块节点;假区块节点也可以收缩为一个普通节点。
但是这个例子真就这么简单吗?实际上,它是一个有专门名字的特殊技巧:空矩形(Empty Rectangle)。但是矩形在哪儿呢?空又是什么意思呢?
四、空矩形的深入探讨
还是回到这个例子,这次我们使用另一种视角来探讨空矩形的意义。
TapTap
如果r1c5=9,那么经过图上的一条弱链和一条强链,推出r8c7=9。这时会发现,r1c5的9和r8c7的9对于b3宫做摒除,导致整个宫没有任何一处可以填9。通过正确的推理过程得到了荒谬的结论,那就是前提错误。因此得到r1c5≠9。
有时候,我们会发现一宫内能填数字的地方,被排列成了L形或者T形。这种情况似乎“更容易”发生上述无数可填的状况,只要两个数字就可以废掉一整个宫的填数。在这两个数字中,如果很不巧地,一个数字的成立可以直接推出另一个数字也成立,那么宫内就没有可以填这个数字的空间了。这就是空矩形的精髓,利用宫内可填数位置的特殊构型,来排除无数可填的情况。
刚才我们演示了让一个L型宫无数可填的操作。我们注意到两个关键位置上的数字(姑且叫做A和B),它们关乎这个宫的命脉,只要A和B同时成立,这宫就无数可填了。为了从A推出B(或者反过来),至少需要一条弱链和一条强链,其中强链是最大的要点。
据此可以复盘出空矩形的一种不错的观察角度:
①任意选择一个剩余空间为L型或者T型的宫,画出一横一竖两条边以及它们的交叉点。这个剩余空间是相对于候选数能填的位置而言,而不一定是单元格的形状。
TapTap
②任意延长(包括反向延长)一条边,你会发现它穿过了一些9。从里面挑出能垂直该边引出强链的9,并且把强链也画出来。
TapTap
③将另一条边延长;同时,画出强链另一端相对于强链的垂线。这两条线会交于另一个单元格,如果这单元格恰好有候选数9,那么空矩形的构型就直接形成了。
TapTap
我们会发现,L型宫的两边,这条强链和这条弱链正好构成了一个矩形。左上角9和右下角9就是那两个关键的数字,由于连续的一弱一强表示推出,因此只能从左上角9为真推出右下角9为真,而不能反过来。因此删数就是那个左上角的9。
从构造上看,空矩形也是一种双强链。现在总结空矩形删数的一般结论:
在构造出正确的矩形之后,空矩形的删数位置是弱链与L/T型宫一条边延长线的交点。
五、从区块链看XYZ-Wing
XYZ-Wing是一个并不难理解的结构,但在这里还是有必要回顾一下它的使用方法:
TapTap
(1)如果中间的z不成立,那么就变成了标准的XY-Wing,即两端的z至少有一个为真。
(2)中间的z成立。
最后的结论是,产生的删数是这三个z能“看到”(希望你还记得“看到”的概念)的区域的交集。
从一方面讲,只有三个z同时能看到的地方才会有删数;另一方面来看,这些地方可以被三个z同时看到。总而言之,三个z至少有一个为真。
但强链只能用于表达两个节点至少一个为真,此时需要借助区块链来表达这一要点。你可以这样:
TapTap
还可以:
TapTap
甚至可以:(这种情况的用途不是很多)
TapTap
到此为止,你可以正式将XYZ-Wing这个简约而不是很简单的结构加入到你的链了。
--------
干货满满,来个小结~
1. 区块可以当做一个普通的节点写进交替推导链中。关于候选数n的区块,节点为真表示区块内有且仅有一个n;节点为假表示区块内所有单元格都不是n。
2. 对于区块节点,真节点扩张后仍为真,假节点收缩后仍为假。
3. 空矩形是一种双强链的结构,本质上相当于区块链版本的双线风筝。在构造出正确的矩形之后,空矩形的删数位置是弱链与L/T型宫一条边延长线的交点。
4. 在XYZ-Wing中出现三次的那个候选数,至少有一个是真的。只要使用区块链,就可以用一条强链来表述它们的逻辑关系了。
--------
思考:空矩形是否也会存在孪生的情况(也就是一个空矩形结构同时产生了两个不同的删数)?
14
9
3