动态环的删数
Elimination Analysis on Dynamic Loop
最后更新于
Elimination Analysis on Dynamic Loop
最后更新于
本文将探讨动态分支逻辑下最难的一点:动态环的删数。
如图所示。之前就说环没有起点,现在倒好,还加入了分支的设定,这下彻底没办法看了。
别急。我们先找出这个环里的分支位置。可以看到,这个环的分支在 r7c6
这个单元格。进入这个单元格里的是弱链关系(8r7c2-8r7c6
这个弱链关系),所以下一个应该是强链关系。但很明显,这个单元格有三个候选数,根本就不存在强链关系,所以我们需要借助分支的方式进行讨论。
当分支走向 r7c6(2)
的时候,我们会绕到 r5c8(2)
为真,然后 r5c8(1)
为假;当分支走向 r7c6(5)
的时候,我们会走上面,带待定数组这个分支。然后照样会到 r5c8(1)
为假。此时汇入同一个候选数节点上,继续朝左,并最后又会回到 r7c6
这个分叉的单元格上。
这个环具有两个分支,并最终会汇入到同一个候选数上,因此就是很简单的动态的逻辑。不过,因为它收尾相连的时候不存在任何推导上的矛盾,所以这个环可以这么周而复始地无限进行下去。所以,它从定义上来看是符合环的特征的。但是,因为它有动态的因素在里面,所以删数都含有哪些呢?
从逻辑的角度来看,我们很清楚地知道,动态所产生的分支,他们各自是独立的状态;也就是说,他们两边是并列的关系,我们只能知道他们从形式上满足环的特征,但实际具体哪一个分支是这个题最终的选取结果,我们并不清楚。说人话就是,虽然我们知道 r7c6
这里有分支了,但是我们不清楚 r7c6
在答案上填的是哪个数字,也就意味着我们并不能判断这个链的分支走向具体是哪一边是成立的。这也告诉了我们,虽然环是可以全弱链删数的,但这一点被动态的分支所打破,所以我们不能盲目地使用之前的结论套用到动态环上去。
于是,我们整理了思路,我们发现,整个环里分叉出去的部分肯定是不能删数的,而只有汇入了之后,到分叉之前的这个部分里,所有弱链关系才能用于删数。对于这个题来说,只有 1r5c8=1r5c2-(1=8)r7c2-8r7c6
这一截的弱链关系可以用来删数。梳理出来,这个题的删数就只有 r7c5 <> 8
这一个结论。
我们把这个环称为动态连续环(Dynamic Continuous Loop)。
等会儿!你可能会问我,连续环的英文不是 continuous nice loop 么,这 nice 这个单词呢?别急。下面我们就来说说这个动态环的分类。
对于动态环而言,因为动态分支的特征,所以环里可能弱链关系不全可以用于删数。所以,对于动态环来说,环是分为全弱链删数和非全弱链删数两种情况的。像是刚才讲解的例子里,它就属于非全部弱链都能删数的这种情况。我们把这种称为半环(Non-nice Loop);相反地,我们把动态环里所有弱链都可以用于删数的环,称为全环(Nice Loop)。是的,这个 nice 用来表示的是环上是否全部弱链都可以参与删数。当为半环的时候,一般是用 non-nice 一词修饰,或者干脆就不写。比如刚才这个题,严格取名的话,应该是叫“动态连续半环”的,而半环的 non-nice 一般不写出来用来和 nice 区分,所以英文名的 nice 才会不见的。
我知道,你肯定会问我,既然是动态环,自然会产生分支。就刚才例子来看,这种分支显然是客观并列的形态,所以肯定不是所有弱链都可用于删数。但是也确实想不到有什么情况下,动态环还能是全环的情况。
如果我们从这个分支的视角去理解动态环删数的话,那么势必是想不通的,因为它没有触碰最为本质的逻辑。我们先了解一下,对于刚才这种环,删数并不是全部弱链关系的最底层、最本质的原因。当我们知道了这个原因后,我们就知道为什么动态分全环和半环,以及什么时候动态环是全环状态。
抓住删数的本质,就是去找寻为什么弱链上的候选数有的可删,有的不可删。
我们回忆一下普通的连续环。非动态的连续环的所有弱链关系上均可引发删数,其本质原因是,我们清楚地知道,所有弱链都可以先拆开,然后形成普通的链后,按普通链删数;而其链的删数恰好就是弱链关系连接的这个走向上。换一种说法的话,我们可以知道的是,弱链两头的端点总会有其中一个节点是为真的,它可以保证我们这个弱链上必然存在可用于删数的节点信息。
记住这一点。弱链两头的端点总会有其中一个节点是为真的,所以这个弱链可以用作删数。我们将基于这个规则来看动态环的删数分析。
我们回到刚才的例子。这个动态环需要分析是否弱链两头的端点是否真的会有其中一个节点为真。
如图所示。现在我们需要分析它的填数状态,那么我们就需要排列出整个环里所有节点的真假状态。
1
r1c6 = 5、r2c5 = 1、r3c8 = 1、r5c2 = 1、r5c8 = 2、r7c2 = 8、r7c6 = 2
2
r1c6 = 5、r2c5 = 6、r3c8 = 1、r5c2 = 1、r5c8 = 2、r7c2 = 8、r7c6 = 2
3
r1c6 = 5、r2c5 = 6、r2c7 = 1、r5c2 = 1、r5c8 = 2、r7c2 = 8、r7c6 = 2
4
r1c6 = 5、r2c5 = 6、r2c7 = 1、r5c8 = 1、r7c2 = 1、r7c6 = 8、r7c8 = 2
5
r1c6 = 6、r2c5 = 1、r3c8 = 1、r5c2 = 1、r7c2 = 8、r7c6 = 5、r7c8 = 2
6
r1c6 = 6、r2c5 = 1、r3c8 = 1、r5c2 = 1、r7c2 = 8、r7c6 = 5、r5c8 = 2
7
r1c6 = 6、r2c5 = 1、r3c8 = 1、r5c2 = 1、r7c2 = 8、r7c6 = 2、r5c8 = 2
而这个环用到了如下的一些弱链:
1r5c2-1r7c2
主线
8r7c2-8r7c6
主线
5r7c6-5r1c6
分支
1r3c8-1r5c8
分支
2r7c6-2r7c8
分支
(2-1)r5c8
分支
r1c6(6)
和 r2c5(6)
待定数组
如果待定数组要参与删数,这里俩 6 就会发挥删数的作用
这里带了个待定数组会无形之中增加分析的难度,但好在这个题删数用不上它。
假如哈,我是说假如,假如这个待定数组可以用作删数,那么这俩 6 就会被考虑在内。虽然它不算弱链关系,但因为待定数组被我们整体分析的,所以删数考虑起来会麻烦非常多。不过,对于这个题而言,因为待定数组的结构还算简单,所以其实可以转为普通的强弱链关系,如
(5=6)r1c6-(6=1)r2c5
这样迂回地走过去,这样的话6r1c6-6r2c5
的弱链关系就会体现出来;那么删数分析的时候,这两处的 6 如果有删数就会被我们前面列举的弱链关系的这个表格所记录,就不会造成删数遗漏。
我们对比前面得到的 7 种不同的排列情况,然后强行去找是否弱链关系的其中一个端点在这个情况组合下为真的。于是我们又会得到这一张表:
1r5c2-1r7c2
1、2、3、5、6、7(r5c2 = 1);4(r7c2 = 1)
⭕
8r7c2-8r7c6
1、2、3、5、6、7(r7c2 = 8);4(r7c6 = 8)
⭕
5r7c6-5r1c6
1、2、3、4(r1c6 = 5);5、6(r7c6 = 5)
❌(缺少情况 7)
1r3c8-1r5c8
1、2、5、6、7(r3c8 = 1);4(r5c8 = 1)
❌(缺少情况 3)
2r7c6-2r7c8
1、2、3、7(r7c6 = 2);4、5(r7c8 = 2)
❌(缺少情况 6)
(2-1)r5c8
1、2、3、6、7(r5c8 = 2);4(r5c8 = 1)
❌(缺少情况 5)
6r1c6-6r2c5
2、3、4(r2c5 = 6);5、6、7(r1c6 = 6)
❌(缺少情况 1)
在完整列举完毕后,我们可以清楚地知道,只有头两个弱链关系,在所有 7 种可能的排列下,全都存在两端至少有一端为真的情况。所以,这两个弱链关系可用于删数;但后面几种均不可用于删数,因为并非全部情况都存在两端至少有一端为真。
因为我们保证稳定删数是需要要求所有可能填数均需要让删数成立的,所以但凡其中有一种情况不成立,那么整个弱链关系就不能用作删数了。可以从表里看出,后续的弱链关系每一个都只存在一种情况不满足,但就正是因为这缺少的情况,导致整个弱链关系在这种情况下不构成至少一端为真,进而无法保证它能用作删数。
总之,要想让弱链关系用于删数层面,需要使得这个弱链关系能在所有可能的填数排列形态下(不违背数独规则的、能填写到节点上的所有填数可能),验证弱链两端是否在所有情况下均存在至少一端为真。我们把这种分析删数的行为称为弱链删数分析(Weak Inference Elimination Analysis),简称删数分析(Elimination Analysis)。
至此,我们就把动态环的基本删数原理介绍完了。下一节我们就来看看一些动态环的实例。