环的基本推理
Reasoning of Loop
最后更新于
Reasoning of Loop
最后更新于
什么是环呢?我们先来看一个例子。
如图所示。这是一个普通得不能再普通的环。红色的全是删数(一共有 11 个),不过我们得一点一点来学。这个环的写法如下:
我们发现,这个链的强弱关系完全交替进行,但我们绕着环看一整圈都未必能发现起点在哪里。既然如此,我们为了强制能看成链,我们任意拆掉其中一个弱链关系,把它断开,因为断开的是弱链关系,所以头尾的强链关系得以保留,链仍然可以成立。
就这么干。我们发现,比如我们断开 8r1c2-8r1c6
这个弱链关系,那么这个环就会从 r1c2(8)
开始往下走,然后走了一条很长的链回到 r1c6(8)
结束。此时,因为链是成立的,所以删数应该看的是头尾的交集。链头是 r1c2(8)
,而链尾是 r1c6(8)
。他们同在一个行上(这不废话吗?)。所以,同一行上的其余位置的候选数 8 理应是可以去掉的。这样我们就得到了 r1c9 <> 8
的结论。
看起来,这个环路因为强弱是完全交替的,所以看起来似乎断开哪一个弱链关系都不会影响到链的成立。那么我们把所有弱链每一个都断开一下,然后去找删数。我们就可以发现,把他们每一个断开后找到的删数序列全部整理出来,便是这个图里画出来的所有红色的删数。
这里要补充一点:千万别忘了单元格里的删数。比如例子里 r6c1(3)
可以删,它删数的由来是断开了 (7-1)r6c1
这个弱链关系得到的。而因为链的头尾均在同一个单元格,所以这个单元格里必须填一个 1 或 7,所以别的候选数都填不进去。
我们把这个技巧称为连续环(Continuous Nice Loop,简称 CNL),一般也简称为环。
实际上,环的极限远不止这样。下面我们来看一个例子,一共有 17 个删数。
你可以自己看看这个例子。虽然看着挺复杂的,但是好在它其实就是多用了几次强弱链关系的编排方式而已,只要链能看明白,环肯定就能看明白。
从前面的例子可以看出来,环具有如下的一些特征:
任意弱链关系都可以拆掉,剩下的都将构成一个链;
环里的所有弱链关系都可以转化为强链关系;
环的节点数和强弱链关系个数都一定是偶数;
环里任意相邻两个节点的真假性互斥;
环只有两种填数状态;
任意节点都可以作为整个环的开头。
这第一个说法是废话,因为我们利用的就是这个特征在解释环的删数原理,所以我们就不解释了。不过这里我们可以补充一下。因为环的所有弱链关系均可断开并使用链的删数规则找删数,那么在删数完成后,你再去看这个弱链关系你就会发现,弱链此时会变为强链关系,因为这两个节点不存在其他位置摆放,直接就使得了不同假的状态的成立,这便是第二点“可转化为强链关系”的真正原因。所以,这一句话倒也不完全是废话。
这个稍加思索就可以得到。因为强弱链需要交替成环,那么强弱链的关系数量一定是一样多的。既然是一样多的,假定我们有 个强链关系和弱链关系,那么总数量就是 个。这肯定是一个偶数。
而在环里,因为不存在独立的节点,所以一个节点引出一个强链关系或一个弱链关系,自然也得是 个。所以节点数也是偶数。
从客观角度来说,一个节点的真假性一共就只有两种:真或假。那么对于两个节点而言,就会有四种情况:真和真、真和假、假和真、假和假。
对于强链关系而言,两个节点必须不同假,因此四个组合里排除掉“假和假”这个情况,还剩下三种满足题意。而它俩能同真吗?看起来可以,但实际上不能。因为节点数量是偶数个,所以只有可能真假性交替出现才能导致环的结构稳定。如果某相邻两个强链关系节点是同真的状态,则这个环就没办法顺次成环状态推导了,毕竟,链理论要求我们按填和不填交替推理,自然在环里就不可能存在相邻节点同真的状态。这一点和普通的链还是不一样的。
所以,两个节点只可能一真一假,即互斥的状态。
既然我们知道相邻节点的填数状态必然互斥,那么整个环又要保证真假性交替出现,自然就只有两种填数可能。我们随意选一个节点开始,设它为假,那么真假性交替起来之后,就会得到一个序列:
假、真、假、真、假、真、……、真
如果我们再设它为真,就会得到完全相反的序列:
真、假、真、假、真、假、……、假
因为是偶数个节点,所以头尾两个节点真假性必然也是相反的,因为它俩客观来说是在环里是相邻的节点。于是,环就只有这两种填法。
然后是最后一条。这一条稍微麻烦一些。它需要链的双向性来得到证明。
我们先来回顾一下链的双向性。由于链使用的强弱链关系在定义上是方向对称的。所谓方向对称,就是说你正向和逆向都可以使用同一个规则进行推导。比如强链关系,能从 到 就一定也能从 到 。正是因为这个原因,再加上链自身强弱关系的摆放也是对称的(强 - 弱 - 强 - 弱 - 强等等),所以链自身也具备可以逆向推理的过程,即正向的链可以进行正常推导,则逆向的也可以推导。
那么,对于环而言,所有同一个真假性的节点一组,就会把节点分为两组。环的推理是不知道从哪里开始的,那么我们不妨就让所有真假性为假的这一组节点作为链头。这样我们按照链的正常方向就可以得到一条完整的环。那么对于真假性设为真的这一组节点呢?我们只需要把环给完全反个向,此时设为真的节点就会变为设为假。
我想你估计可以理解它,但我还是把这句话给解释一下。因为按照链的基本规则,我们必须要以强链起头,所以设为真的这一组是没办法按预设的那个方向推导的(它起步就为真,但链的起步必须是假)。那么反向之后,强链关系毕竟不会受到反向的影响,所以强链关系依旧成立。比如说我们有 和 两个节点是强链关系。那么原本我们假设的是 节点为假和 节点为真,现在我们反向了之后, 节点就会变为强链的开端,而 节点此时反而放在了 的后面。而强链关系是开端的一边设为假的,所以变为 节点开始时,它理应设为假。这就是我刚才说为啥原本设为真的会变为假的原因。当然,这里你也可以使用逆否命题来理解: 的逆否命题是 ,这个更靠近数学说法一些。
随便你怎么理解吧,反正它的真假性会因为反向后变为假,所以理应所有节点都是有假这个状态的,所以他们都可以作为环的开头而存在。
所以,环是没有逻辑上的“链头”的,任意一个节点都可以开头,只是说它最多会取决于你选取的环的方向罢了。
为了技巧的完整性,这里我们再补充一个技巧。
如图所示。这是一个环,不过环内只用了一种数字。我们把这个称为鱼环(Fishy Cycle)或者同数环(X-Cycle)。还记得鱼吗?鱼这个技巧就只用同一种数字,所以这个环是想说明它跟鱼一样只用一种数字。
我们再来看一个区块鱼环(Grouped Fishy Cycle),或者叫同数区块环或区块同数环(Grouped X-Cycle)。
如图所示。这个就稍微带了个区块罢了。
下面我们再来看一个例子。
如图所示。这是一个双值格环(XY-Cycle),即双值格链的基础上成环,所有强链均发生在同一个单元格内。
可能你看完了整篇内容会发现一个问题。文章开始那里还在用 loop 来表示环,怎么到这里新补充的两个技巧的技巧名怎么用的是 cycle?这到底应该用哪一个单词?
这个其实说来话长。非要强行概括的话,你可以认为是历史因素。实际上,loop 和 cycle 均可表示环,也都没有问题,甚至还可以用 ring 来表示环。这三个单词在技巧名称上使用均不会造成问题,比如你说 X-Loop 而不是 X-Cycle,也并不会有问题。但是,一般是因为叫某个说法的人多了,所以就约定俗成使用了这个说法。
本来名称这个东西就没有什么对错,你喜欢你叫什么都行。但是,按照学习的角度去看的话,因为更多人叫它 X-Cycle(用 cycle)、XY-Cycle(用 cycle)、Continuous Nice Loop(用 loop),所以我们就采用更多人的叫法。非要说区别的话,你可以认为是不同的人群导致的倾向性。比如三款不同的数独分析软件 HoDoKu、Sudoku Explainer 和 XSudo 里,HoDoKu 用 loop 更多,Sudoku Explainer 用 cycle 更多,而 XSudo 用 ring 更多。
对于环而言,尤里卡记号并未拥有一个严格的限制,因为强弱链交替的缘故,链尾是可以用弱链连回链头的。
本教程从约定俗成的角度出发,仍然按照链头强链关系起步的逻辑进行描述,直到到最后一个节点时,比正常的链多一个弱链关系表示它连回链头的过程,这样的方式用来区分链和环。例如最开始的例子里,开头是 (8=7)r1c2
,最后是 8r1c6-8r1c2
,描述了连回链头 r1c2(8)
这个节点。