欢迎光临散文网 会员登陆 & 注册

第 58 讲:交叉鱼

2021-09-11 07:13 作者:SunnieShine  | 我要投稿

现在我们来学习一种新的鱼的结构,叫做交叉鱼(或交叉链列,Mutant Fish)。这种结构非常麻烦的地方是,它一点都不好看。

Part 1 交叉鱼的形成

如左图所示,它是一个宫内鱼,我们把其中宫的定义域区域移动到了中间去。现在,我们把b6补到c7上。结构就变为了右图这样。注意到的是,此时的删除域也同时发生了变动。虽然删数的单元格没有发生变动,但是可以看到,由于改变了定义域区域的位置,如果此时还把c89作为删除域区域的话,这个结构的r456c89就删不了了。为什么呢?

我们可以尝试把右图看作一个同数的环结构,即

这个环结构显然是不可能删除r456c89的,因为环的性质只能删除弱关系的对应区域,而r456c89并未在弱关系的区域内。

当然了,你也可以使用最普通的假设,把c7拆分为两种情况:r23c7(x)区块成立和r78c7(x)区块成立两种情况进行讨论,可不管怎么讨论,c456c89(x)跟我们讨论的填数位置无关,或者并不能够在r456c89里找到任意一个单元格,是两个区块不论谁成立都可以删掉的,所以r456c89(x)是删不掉的。

不过,上述两种情况都是为了检验实际情况,我们依旧可以通过理论说明为什么删不掉。首先我们通过这个图示给出的样子找到了3个定义域区域和3个删除域区域,显然它们的个数是相同的,并且删除域也完整覆盖了所有定义域里所有x的可能填数位置,这说明删除域的删数应当都是成立的。不过请你注意的是,删除域区域此时只能包含b39,如果选定为c89,则我们立马就会发现,r2378c7(x)并未覆盖到,此时又得考虑如何去调整删除域区域来覆盖它们,所以这样是不可以的。

那么,我们就称右图这样的结构为交叉鱼。从定义上讲,当定义域或删除域的其中一方同时包含行和列的组合的,就可以叫交叉鱼。比如上述的示例里,定义域是r19c7,同时含有行和列,所以称为交叉鱼;当然,定义里也规定,删除域同时包含行和列的组合,也算作是交叉鱼。那么,宫内鱼和交叉鱼有什么区别呢?宫内鱼只能有行宫和列宫的组合,而交叉鱼则是包含行列的组合。

最后,我们可以看出,图上规定的宫内鱼其实是完全可以转换为交叉鱼的视角的;而交叉鱼也可以转换宫内鱼的视角。它们实际上是可以互相转换的。但,这仅仅是这样的一些简单的情况,有很大一部分的交叉鱼都是无法转换回宫内鱼的;当然,宫内鱼也存在一些情况无法转换为交叉鱼的情况,这一点我们将在后续的示例里逐渐为大家展示出来;而且,交叉鱼涉及行和列,就必然会产生交叉,导致定义域必然重叠的现象,所以交叉处的单元格得视为内鱼鳍看待(当然,最好不要使得结构的该位置包含可能会影响推导的这个候选数)。

Part 2 原理进一步剖析

2-1 交叉鱼的残缺和带鱼鳍的情况

宫内鱼我们分析过了残缺和带鱼鳍的情况,那么交叉鱼由于变换了某一定义域区域的位置,那么残缺情况又应当如何分析呢?而鱼鳍的位置呢?

我们拿出一个交叉三链列(Mutant Swordfish)作为示例给大家展示。

如图所示,这是一个刚才我们得到的交叉三链列,它的定义域是r19c7,删除域则是c2b39。我们为了让残缺的部分去掉后也能继续推导,而且不影响结构的成立,我们此时可以考虑b39里的区块。

我们分别去掉r1c89(x)、r23c7(x)、r78c7(x)和r9c89(x)区块各自的其中某一个单元格,把它们画成“/”,再来看看,它是否成立呢?

可以看到,就算是变为了这样,结构依旧是可以保证成立的,因为定义域区域和删除域区域数始终没有发生变化,而且全覆盖依旧是做到了。当然,从实际上分析,比如我们使用环的视角,可以发现,它仅仅是修改了环内的区块节点,而变为了候选数节点,但是弱关系区域并未发生任何的变动,所以删数照样是成立的。

2-2 交叉鱼的鱼鳍

那交叉鱼会有鱼鳍吗?如果有,那鱼鳍的位置呢?实际上,交叉鱼的鱼鳍,不论是外鱼鳍还是内鱼鳍,都非常好分析,因为随便选取一个原来给的完整版的鱼图里,除了r19c456的其它任何画“/”的地方都可以作为鱼鳍,因为它们均可以对应到删数;而r19c7两处是定义域区域的交集处,它们可以视作内鳍,此时这个内鳍依旧可以对应到b3或者b9的删除域区域的,所以交叉鱼的内鳍并不像是宫内鱼那样“傲娇”,必须要有重叠才会有内鱼鳍,而且还要找交集。因为交叉鱼生来就一定会有行列交叉,所以内鳍一定是可能产生在交集处的,就根本不存在定义域区域不会重叠的情况。所以它的所有删数在图中都标注了出来。

当然,需要你注意到的地方是,r19c7在图上标注的是F,但是你应当知道,它是内鱼鳍。

2-3 交叉四链列

实际上,交叉四链列的构型也很简单,只需要分析其中一个宫,并改写为行或列就可以了。比如下面的这个示例,改写起来其实非常简单。

左图是原本的带有一个宫的定义域区域的宫内四链列结构,而改写好的交叉四链列的情况如右图所示。可以看到,它和之前的变换逻辑完全一样,仅仅是移动了某一处宫,改写为了列。

当然,不仅仅带有一个宫的可以这么干,带有两个宫的结构依然可以这么干。

可以看到,其实依旧是变为列这么简单。不过,删除域全部都变为了宫。

2-4 交叉二链列

实际上,交叉二链列(Mutant X-Wing)也是理论上存在而已,实际上并不存在。在之前的宫内二链列的内容里我们其实已经介绍了它的逻辑等效于区块,所以交叉二链列仅仅变了一个定义域区域而已,所以结构的删数实际上和宫内二链列是一样的,所以就不作出讨论了。

实际上,就是两个区块,一个行区块,一个列区块。

2-5 同时涉及所有区域类型的交叉鱼

接下来我们再来看一种变种的交叉鱼结构,它的定义域恰好涉及一行一列和一个宫。

如图所示,这种结构依旧属于交叉鱼,因为定义域确实同时含有了行和列的组合,而宫内鱼结构要求不能有行和列的组合。可以看到,这种结构比较神奇的地方在于,我们找到的三个定义域区域和三个删除域区域都是可行的,而且确实全覆盖了,所以删数也是都成立的,只是结构长相比较奇怪罢了。

当然,如果你实在是不愿意使用理论说明,可以采用环结构视角来看。这个示例可以讲结构连起来形成一个同数带区块的连续环结构,不过意义和之前说到的标准版本的交叉鱼的构型是一样的,删数也是产生于弱关系上。

2-6 交叉鱼的转置

当然了,交叉鱼也是存在转置的,不过……

如图所示,这就是交叉鱼的转置后的样子,我们尝试把它的定义域看作c2b39,删除域则改为r19c7。可以发现,从理论上就可以明白,定义域和删除域区域个数不会因为转置而发生改变,所以删数照样是成立的。

下面我们来看交叉鱼的基本示例。因为交叉鱼有一部分无法转换为宫内鱼视角,所以交叉鱼的示例就比较多了,而且还比较难。


第 58 讲:交叉鱼的评论 (共 条)

分享到微博请遵守国家法律