有技巧名的强制链
Named Forcing Chains
最后更新于
Named Forcing Chains
最后更新于
可以看到,前面在假设过程之中,我们用到的思路都是在假设某一个节点为真或假时候引发矛盾。下面我们来看强制链在合并后产生的删数效果。
如图所示。这个链的表示如下:
之前我们介绍的强制链都是从一个节点出发的。这次我们从多个不同节点出发看看能不能推理。比如这个题,我们可以看到, 终点三个分支都指向同一个区域的三个同一个数字的摆放位置,这一点保留了下来;但是起点完全不一样。之前的起点还保留了同一个节点作为初始假设,这次倒好,直接都不一样了。
这是否能推理呢?答案是可以的。这里干脆我们把删数也作为节点纳入到链里,但是分开看。比如这个题,我们先看 r3c1(7)
这个候选数。
假设把他视为一个普通节点来看的话,那么它的下一个节点可以是 r23c2(7)
或者 r3c5(7)
。因为之后的推理是强链关系出去的,所以我们这里添加的应该是一条弱链关系。换言之,我们应假设 r3c1(7)
纳入时的状态是假设它为真。那么,纳入后,可以看到这个链就退化为了一个很普通的区域强制链,并得到最终 r1
所有填 9 的位置全部为假,引发了矛盾。所以,这个假设不成立。
对于 r3c3(7)
而言,好像天助我也一般,它也可以纳入到强制链之中,并接入刚才完全相同的这两个节点,并仍然可以得到同样的矛盾。所以,这样一口气强制链就可以删两个数。
明白了吧。这种强制链仍然是普通的区域强制链或者单元格强制链,只不过我们把开始的节点稍微延后了一步:因为强制链的删数一般只有一个,所以我们延后了节点后,每个分支对应的起点发生了变化。那么他们就可以用类似普通链里“头尾删交集”的效果找出除了延后之前的那个节点以外,还可以纳入的节点都有哪些。然后一并删除。我们把这个过程称为归并强制链(Merged Forcing Chains),即把分支延后后归并得到多个删数的强制链逻辑。它提供了一个找多个删数的强制链的视角。
我们再来看一个例子。
如图所示,这条链的表示如下:
这个题有四个分支,并归并为两个部分。
试想一下,如果强制链的分支里有一个分支起步就是夭折的,这种链会有删数吗?
如图所示。假设我们先忽略掉 r1c5(4)
,我们就可以看到一个完整的链(准确来说,叫区块不连续环):
然后就有了这样的删数。但是,看起来似乎多出来的 r1c5(4)
也并不会影响链的删数,因为这个多出来的数填到格子里,也可以删掉 r6c5(4)
。所以,按鱼鳍的思路看这个数的话,它具有如下的两个情况:
如果 r1c5(4)
为假,则链成立,删数是 r6c5(4)
;
如果 r1c5(4)
为真,则删除行列宫其余位置的 4,也包含 r6c5(4)
。
所以,这个题的结论是 r6c5 <> 4
。
可以看到,这是一个普通的链,外加了一个“鱼鳍”。我们把这种链称为鳍链(Finned Chain)。
我们再来看一个例子。
如图所示。这个例子也自己看吧。这个例子用了两个鱼鳍,假设方式是一样的,先假设鱼鳍都不存在,然后引出链;然后假设鱼鳍存在,于是按鱼鳍存在的位置删,最终交集删数。
你可能会问,这是强制链吗?是的,虽然看起来像是鱼鳍和普通链的结合,但如果你把鱼鳍视为一个独立的分支,并把其中任意一个强链关系拆解为一组可以用于删数的分支的话,那它就会变为强制链的视角。比如这个题,对于 b9
而言,一共有 4 处可以填 5 的位置。那么按照强制链的视角,讨论 5 的全部填数位置,其中两个分支(鱼鳍)将因为假设为真导致直接构成删数;剩下两个分支,就是图中连接为强链关系的 r7c8(5)
和 r8c7(5)
了。把它俩拆开,然后形成两个分支最终仍然可以到达 r1c9(5)
的地方。因此,它其实是可以转为强制链的视角的(尽管这非常没有必要)。
有没有想过,当强制链形成回环后,会有什么样的效果呢?
如图所示。本题有三个分支,从 r1c7
单元格出发,并回到 r4
的所有 6 的位置上。非常巧妙的是,这个题的分支有 3 个,他们完全不同;最终走到 r4
上时,每一个分支都会唯一对应到一个 6 的位置上去。所有强链关系引出,并用弱链关系引入。写法如下:
看起来这个似乎跟前面任何的强制链的思路都没有关联。这是怎么删数的呢?我们思考一个问题哈。本题的强链关系出去,弱链关系收回的逻辑会不会存在一些特殊效果?
我指的是什么效果呢?比如说,我们显然发现,弱链收回的 r4
实际上仅存在这三个可以放 6 的位置,不存在其他单元格可以填 6。这说明什么?这说明 6 必须落入其中一个分支上。而我们之前说过,链是可以逆向的,那么对于强弱链关系来说,我们就可以从终点往回看,这样就可以满足三个 6 的位置的其中一个分支起点假设为真的逻辑。
按照这个思路进行,我们最终会回到 r1c7
这个单元格。因为回去的三个分支全部是强链关系,所以也就意味着我们最终会得到 r1c7
里其中一个候选数为真。既然其中一个候选数为真,那么剩下的两个就会变为假的状态。于是?于是这个链的其余两个分支就可以顺推回到 r4
的另外两个 6 的填数位置上去,使得剩下两个分支的 6 为假。
而对于我们刚才反推的“中转站”单元格 r1c7
而言,因为三个分支均会走这个单元格的其中一个候选数经过且均都是为真的状态经过的,所以 r1c7
里的三个候选数 6、7、8 必须有一个为真。当然,这个题的 r1c7
不存在其他的候选数;如果有的话,这个单元格的其余候选数是可以删除的;而对于其他分支上而言,我们也可以认为,本题所有用到弱链两端的节点,虽说弱链关系是不同真,但是原本弱链关系是可以同假的,但是这个闭环的话是不存在的,因为思路闭环上并未出现两端同假的状态。换言之,如果任意假设一个弱链关系的两端同为假的话,则一定会推得矛盾。为什么呢?因为能安排如此排布的数字都是一真一假这么交替摆放的(除了 r1c7
和 r4
这里开头和收尾的两个地方);当你一旦设其中一个弱链关系两端为假的时候,这里就没办法正常推导,所以导致的矛盾就必然会是诸如 r4
三处 6 均无法填数这样的矛盾。
所以,这种思路闭环的删数分为两部分:
r1c7
这个中转站如果存在除了 6、7、8 外的别的候选数,就都可以删除;
所有弱链关系必定一真一假(不可能同假),因此可以按环的类似形式删数。
因为这个删数逻辑(尤其是第二点)非常类似于环的效果,所以这种强制链回环的技巧被我们称为绽放环(Blossom Loop)。
我们再来看一个例子。
如图所示。这个题也希望你自己推理。
在前面我们学到过待定数组的链。但实际上它是可以走分支的。下面我们来看一下待定数组在强制链的运用。
如图所示。我们按单元格 r7c4
讨论三种情况。
如果 r7c4 = 3
,则待定数组 r3c4
这个单元格只能填 2;
如果 r7c4 = 4
,则待定数组 r239c5
三个单元格里只剩下 2、6、7,形成三数组;
如果 r7c4 = 5
,则待定数组 r2c45, r3c5
三个单元格只剩下 2、6、7,形成三数组。
因为三种情况要么填 2,要么形成数组里含 2,所以所有 2 都可以用于删数。对于这个题来说,删数是 r1c5 <> 2
。我们把这个技巧称为死亡绽放(Death Blossom),即使用单元格进行强制链讨论;然后每一个分支都映射了一个待定数组,每一个待定数组全部都可以删除同一个候选数或若干候选数的情况。
那么至此我们就把强制链的内容介绍完了。
这可能有些绕。我说细致一些。我想说的是,因为我们知道 r4
只有三处填 6 的位置。假设填入其中一个位置(假设此时是 这个位置填),那么剩下的俩 和 就为假;但是,我们也可以通过先从 这个位置反推回单元格 r1c7
的三个候选数上(暂且记作 、 和 )。
在我们假设 为真的时候会得到 为真(因为尾巴这里是强链关系,从假到真的是强链关系);而 为真的同时又可以直接认定 和 是为假的,于是 和 按顺推就会为假(因为这次尾巴这里是弱链关系,从真到假的是弱链关系)。于是就构成了这么个链路关系:
我们再次假设 和 两边时也都可以分别得到类似的结论,且所有强弱链关系均不会造成推断矛盾(比如说“本来设为强链关系的,但是假设了其中一个数为真的时候这里不成立了”之类的问题)。这意味着它形成了完美的思路闭环。这里说的“思路闭环”是说它的推导过程是完全闭环的,不会通过任意的位置走出这个推导线路。总之就是,因为 、 和 的填数状态是互斥的(整个行只有一个可以填 6 的位置,也必须有一个填 6 的位置),所以三者不能共存。而我们任意保留其中一个,都能使得整个链路回环运作起来且不发生矛盾。