第 58 講:交叉魚
現(xiàn)在我們來(lái)學(xué)習(xí)一種新的魚的結(jié)構(gòu),叫做交叉魚(或交叉鏈列,Mutant Fish)。這種結(jié)構(gòu)非常麻煩的地方是,它一點(diǎn)都不好看。
Part 1?交叉魚的形成


如左圖所示,它是一個(gè)宮內(nèi)魚,我們把其中宮的定義域區(qū)域移動(dòng)到了中間去?,F(xiàn)在,我們把b6補(bǔ)到c7上。結(jié)構(gòu)就變?yōu)榱擞覉D這樣。注意到的是,此時(shí)的刪除域也同時(shí)發(fā)生了變動(dòng)。雖然刪數(shù)的單元格沒有發(fā)生變動(dòng),但是可以看到,由于改變了定義域區(qū)域的位置,如果此時(shí)還把c89作為刪除域區(qū)域的話,這個(gè)結(jié)構(gòu)的r456c89就刪不了了。為什么呢?
我們可以嘗試把右圖看作一個(gè)同數(shù)的環(huán)結(jié)構(gòu),即
這個(gè)環(huán)結(jié)構(gòu)顯然是不可能刪除r456c89的,因?yàn)榄h(huán)的性質(zhì)只能刪除弱關(guān)系的對(duì)應(yīng)區(qū)域,而r456c89并未在弱關(guān)系的區(qū)域內(nèi)。
當(dāng)然了,你也可以使用最普通的假設(shè),把c7拆分為兩種情況:r23c7(x)區(qū)塊成立和r78c7(x)區(qū)塊成立兩種情況進(jìn)行討論,可不管怎么討論,c456c89(x)跟我們討論的填數(shù)位置無(wú)關(guān),或者并不能夠在r456c89里找到任意一個(gè)單元格,是兩個(gè)區(qū)塊不論誰(shuí)成立都可以刪掉的,所以r456c89(x)是刪不掉的。
不過,上述兩種情況都是為了檢驗(yàn)實(shí)際情況,我們依舊可以通過理論說(shuō)明為什么刪不掉。首先我們通過這個(gè)圖示給出的樣子找到了3個(gè)定義域區(qū)域和3個(gè)刪除域區(qū)域,顯然它們的個(gè)數(shù)是相同的,并且刪除域也完整覆蓋了所有定義域里所有x的可能填數(shù)位置,這說(shuō)明刪除域的刪數(shù)應(yīng)當(dāng)都是成立的。不過請(qǐng)你注意的是,刪除域區(qū)域此時(shí)只能包含b39,如果選定為c89,則我們立馬就會(huì)發(fā)現(xiàn),r2378c7(x)并未覆蓋到,此時(shí)又得考慮如何去調(diào)整刪除域區(qū)域來(lái)覆蓋它們,所以這樣是不可以的。
那么,我們就稱右圖這樣的結(jié)構(gòu)為交叉魚。從定義上講,當(dāng)定義域或刪除域的其中一方同時(shí)包含行和列的組合的,就可以叫交叉魚。比如上述的示例里,定義域是r19c7,同時(shí)含有行和列,所以稱為交叉魚;當(dāng)然,定義里也規(guī)定,刪除域同時(shí)包含行和列的組合,也算作是交叉魚。那么,宮內(nèi)魚和交叉魚有什么區(qū)別呢?宮內(nèi)魚只能有行宮和列宮的組合,而交叉魚則是包含行列的組合。
最后,我們可以看出,圖上規(guī)定的宮內(nèi)魚其實(shí)是完全可以轉(zhuǎn)換為交叉魚的視角的;而交叉魚也可以轉(zhuǎn)換宮內(nèi)魚的視角。它們實(shí)際上是可以互相轉(zhuǎn)換的。但,這僅僅是這樣的一些簡(jiǎn)單的情況,有很大一部分的交叉魚都是無(wú)法轉(zhuǎn)換回宮內(nèi)魚的;當(dāng)然,宮內(nèi)魚也存在一些情況無(wú)法轉(zhuǎn)換為交叉魚的情況,這一點(diǎn)我們將在后續(xù)的示例里逐漸為大家展示出來(lái);而且,交叉魚涉及行和列,就必然會(huì)產(chǎn)生交叉,導(dǎo)致定義域必然重疊的現(xiàn)象,所以交叉處的單元格得視為內(nèi)魚鰭看待(當(dāng)然,最好不要使得結(jié)構(gòu)的該位置包含可能會(huì)影響推導(dǎo)的這個(gè)候選數(shù))。
Part 2?原理進(jìn)一步剖析
2-1?交叉魚的殘缺和帶魚鰭的情況
宮內(nèi)魚我們分析過了殘缺和帶魚鰭的情況,那么交叉魚由于變換了某一定義域區(qū)域的位置,那么殘缺情況又應(yīng)當(dāng)如何分析呢?而魚鰭的位置呢?
我們拿出一個(gè)交叉三鏈列(Mutant Swordfish)作為示例給大家展示。

如圖所示,這是一個(gè)剛才我們得到的交叉三鏈列,它的定義域是r19c7,刪除域則是c2b39。我們?yōu)榱俗寶埲钡牟糠秩サ艉笠材芾^續(xù)推導(dǎo),而且不影響結(jié)構(gòu)的成立,我們此時(shí)可以考慮b39里的區(qū)塊。
我們分別去掉r1c89(x)、r23c7(x)、r78c7(x)和r9c89(x)區(qū)塊各自的其中某一個(gè)單元格,把它們畫成“/”,再來(lái)看看,它是否成立呢?

可以看到,就算是變?yōu)榱诉@樣,結(jié)構(gòu)依舊是可以保證成立的,因?yàn)槎x域區(qū)域和刪除域區(qū)域數(shù)始終沒有發(fā)生變化,而且全覆蓋依舊是做到了。當(dāng)然,從實(shí)際上分析,比如我們使用環(huán)的視角,可以發(fā)現(xiàn),它僅僅是修改了環(huán)內(nèi)的區(qū)塊節(jié)點(diǎn),而變?yōu)榱撕蜻x數(shù)節(jié)點(diǎn),但是弱關(guān)系區(qū)域并未發(fā)生任何的變動(dòng),所以刪數(shù)照樣是成立的。
2-2?交叉魚的魚鰭
那交叉魚會(huì)有魚鰭嗎?如果有,那魚鰭的位置呢?實(shí)際上,交叉魚的魚鰭,不論是外魚鰭還是內(nèi)魚鰭,都非常好分析,因?yàn)殡S便選取一個(gè)原來(lái)給的完整版的魚圖里,除了r19c456的其它任何畫“/”的地方都可以作為魚鰭,因?yàn)樗鼈兙梢詫?duì)應(yīng)到刪數(shù);而r19c7兩處是定義域區(qū)域的交集處,它們可以視作內(nèi)鰭,此時(shí)這個(gè)內(nèi)鰭依舊可以對(duì)應(yīng)到b3或者b9的刪除域區(qū)域的,所以交叉魚的內(nèi)鰭并不像是宮內(nèi)魚那樣“傲嬌”,必須要有重疊才會(huì)有內(nèi)魚鰭,而且還要找交集。因?yàn)榻徊骠~生來(lái)就一定會(huì)有行列交叉,所以內(nèi)鰭一定是可能產(chǎn)生在交集處的,就根本不存在定義域區(qū)域不會(huì)重疊的情況。所以它的所有刪數(shù)在圖中都標(biāo)注了出來(lái)。

當(dāng)然,需要你注意到的地方是,r19c7在圖上標(biāo)注的是F,但是你應(yīng)當(dāng)知道,它是內(nèi)魚鰭。
2-3?交叉四鏈列
實(shí)際上,交叉四鏈列的構(gòu)型也很簡(jiǎn)單,只需要分析其中一個(gè)宮,并改寫為行或列就可以了。比如下面的這個(gè)示例,改寫起來(lái)其實(shí)非常簡(jiǎn)單。


左圖是原本的帶有一個(gè)宮的定義域區(qū)域的宮內(nèi)四鏈列結(jié)構(gòu),而改寫好的交叉四鏈列的情況如右圖所示。可以看到,它和之前的變換邏輯完全一樣,僅僅是移動(dòng)了某一處宮,改寫為了列。
當(dāng)然,不僅僅帶有一個(gè)宮的可以這么干,帶有兩個(gè)宮的結(jié)構(gòu)依然可以這么干。


可以看到,其實(shí)依舊是變?yōu)榱羞@么簡(jiǎn)單。不過,刪除域全部都變?yōu)榱藢m。
2-4?交叉二鏈列
實(shí)際上,交叉二鏈列(Mutant X-Wing)也是理論上存在而已,實(shí)際上并不存在。在之前的宮內(nèi)二鏈列的內(nèi)容里我們其實(shí)已經(jīng)介紹了它的邏輯等效于區(qū)塊,所以交叉二鏈列僅僅變了一個(gè)定義域區(qū)域而已,所以結(jié)構(gòu)的刪數(shù)實(shí)際上和宮內(nèi)二鏈列是一樣的,所以就不作出討論了。


實(shí)際上,就是兩個(gè)區(qū)塊,一個(gè)行區(qū)塊,一個(gè)列區(qū)塊。
2-5?同時(shí)涉及所有區(qū)域類型的交叉魚
接下來(lái)我們?cè)賮?lái)看一種變種的交叉魚結(jié)構(gòu),它的定義域恰好涉及一行一列和一個(gè)宮。

如圖所示,這種結(jié)構(gòu)依舊屬于交叉魚,因?yàn)槎x域確實(shí)同時(shí)含有了行和列的組合,而宮內(nèi)魚結(jié)構(gòu)要求不能有行和列的組合??梢钥吹剑@種結(jié)構(gòu)比較神奇的地方在于,我們找到的三個(gè)定義域區(qū)域和三個(gè)刪除域區(qū)域都是可行的,而且確實(shí)全覆蓋了,所以刪數(shù)也是都成立的,只是結(jié)構(gòu)長(zhǎng)相比較奇怪罷了。
當(dāng)然,如果你實(shí)在是不愿意使用理論說(shuō)明,可以采用環(huán)結(jié)構(gòu)視角來(lái)看。這個(gè)示例可以講結(jié)構(gòu)連起來(lái)形成一個(gè)同數(shù)帶區(qū)塊的連續(xù)環(huán)結(jié)構(gòu),不過意義和之前說(shuō)到的標(biāo)準(zhǔn)版本的交叉魚的構(gòu)型是一樣的,刪數(shù)也是產(chǎn)生于弱關(guān)系上。
2-6?交叉魚的轉(zhuǎn)置
當(dāng)然了,交叉魚也是存在轉(zhuǎn)置的,不過……

如圖所示,這就是交叉魚的轉(zhuǎn)置后的樣子,我們嘗試把它的定義域看作c2b39,刪除域則改為r19c7。可以發(fā)現(xiàn),從理論上就可以明白,定義域和刪除域區(qū)域個(gè)數(shù)不會(huì)因?yàn)檗D(zhuǎn)置而發(fā)生改變,所以刪數(shù)照樣是成立的。
下面我們來(lái)看交叉魚的基本示例。因?yàn)榻徊骠~有一部分無(wú)法轉(zhuǎn)換為宮內(nèi)魚視角,所以交叉魚的示例就比較多了,而且還比較難。