第 43 講:動(dòng)態(tài)鏈
如果說強(qiáng)制鏈?zhǔn)擎湹囊环N推廣形式的話,那么現(xiàn)在要講到的動(dòng)態(tài)鏈(Dynamic Chain)就是另外一個(gè)層面的鏈的推廣。
動(dòng)態(tài)鏈強(qiáng)調(diào)鏈可以包含不同的分支,并且分支能夠進(jìn)行匯總,得到想要的結(jié)果。這種鏈可以依賴于AIC,即強(qiáng)關(guān)系開頭、強(qiáng)關(guān)系結(jié)尾,并且強(qiáng)弱關(guān)系交替進(jìn)行的鏈。
Part 1 動(dòng)態(tài)鏈?zhǔn)窃趺催\(yùn)作的?
1-1?一則示例

如圖所示,我們假設(shè)r4c2(1)為假,則可以得到r6c3(1)為真。此時(shí)我們走兩個(gè)分支方向:
方向1:由于r6c3(1)真,所以r2c3(1)為假,r2c3(9)為真,可以得到r2c6(9)為假。
方向2:由于r6c3(1)真,所以r6c3(9)為假,所以r6c7(9)為真,r1c7(9)假,r3c8(9)真,r3c6(9)假。
由于分支起頭都是r3c6(1)為真,所以不論走哪個(gè)分支,最終的結(jié)果也應(yīng)當(dāng)是同時(shí)成立的。所以此時(shí)應(yīng)當(dāng)由r2c6(9)和r3c6(9)同時(shí)為假。所以此時(shí)c6只有一處可以填入9,即r4c6,所以城之內(nèi)r4c6 = 9。所以此時(shí)鏈從r4c2(1)為假得到了r4c6(9)為真,故視作不連續(xù)環(huán)處理,刪除兩端的交集,即r4c2(9)。
這條鏈在中途某處出現(xiàn)兩個(gè)分支方向,并最終通過同時(shí)成立的結(jié)果來進(jìn)行歸并,并得到最終的結(jié)果。我們稱帶有不同分支的標(biāo)準(zhǔn)鏈為動(dòng)態(tài)標(biāo)準(zhǔn)鏈(簡稱動(dòng)態(tài)鏈,Dynamic AIC)。當(dāng)然,強(qiáng)制鏈分身就帶有分支,所以強(qiáng)制鏈單獨(dú)有特殊的規(guī)定:如果強(qiáng)制鏈的某個(gè)分支上含有不同的分支,此時(shí)我們稱整個(gè)強(qiáng)制鏈為動(dòng)態(tài)強(qiáng)制鏈(Dynamic Forcing Chain)。由于動(dòng)態(tài)強(qiáng)制鏈比強(qiáng)制鏈更為暴力,所以此處我們就不再舉例說明,它的邏輯和動(dòng)態(tài)鏈其實(shí)是完全一樣的效果。
和不連續(xù)環(huán)一樣,它的首尾也是不連續(xù)環(huán)的刪數(shù)模式,所以這個(gè)鏈稱為動(dòng)態(tài)不連續(xù)環(huán)(Dynamic Discontinuous Loop),注意,此處不應(yīng)書寫Nice一詞。Nice是否應(yīng)該書寫將在后面進(jìn)行討論。
1-2?文本表達(dá)
和AIC一樣,動(dòng)態(tài)鏈依然需要文本的表述格式。不過由于動(dòng)態(tài)鏈帶有分支,所以我們將從分支處用冒號(hào)起頭,并把每個(gè)分支單獨(dú)換行書寫。例如上面的示例的鏈的表達(dá)是
這種格式的書寫方法依賴于換行和縮進(jìn)。如果在不合適的地方多寫了縮進(jìn),或者是本應(yīng)該縮進(jìn)的地方?jīng)]有縮進(jìn),就無法直接判斷鏈的該部分是否應(yīng)在主線上。
還有一點(diǎn)要注意的是,每行結(jié)尾處必須標(biāo)注出節(jié)點(diǎn)涉及的候選數(shù),不能夠省略,因?yàn)閾Q行后可能為分支路線,我們不能保證它在還原時(shí),應(yīng)還原為具體是哪一個(gè)分支的開頭節(jié)點(diǎn)的涉及候選數(shù)。
另外,由于r2c6(9)和r3c6(9)兩個(gè)分支的末端是弱關(guān)系,所以歸并的時(shí)候,我們將繼續(xù)使用強(qiáng)關(guān)系,故r4c6(9)應(yīng)用強(qiáng)關(guān)系連接。這也是符合鏈的規(guī)則的。
Part 2?嵌套結(jié)構(gòu)的動(dòng)態(tài)鏈
2-1?嵌套ALS的動(dòng)態(tài)鏈

如圖所示,這條鏈有點(diǎn)小繞。
鏈的表示如下:
邏輯是這樣的:由于鏈的起始需要設(shè)為假,所以設(shè)r3c1(3)為假,則同時(shí)可以得到r2c2(3)和r3c8(3)為真。兩端引出兩條不同的鏈后,分別得到r4c5(4)和r4c8(3)為假,所以r4c1(1)此時(shí)必然應(yīng)為真。所以r3c1(3)為假時(shí),r4c1(1)應(yīng)為真,所以r3c1(3)和r4c1(1)至少一個(gè)為真,按照不連續(xù)環(huán)的邏輯,刪掉r3c1(1)。
有點(diǎn)疑問。觀察r4,r4有多個(gè)單元格涂色,但顯然不是ALS,因?yàn)閿?shù)一下單元格數(shù)和候選數(shù)種類數(shù),發(fā)現(xiàn)是相差2而不是相差1的。
那么,你這么理解一下:r3c1(3)為假時(shí),r2c2(3)和r3c8(3)同時(shí)為真。r2c2(3)引出的鏈得到了r4c5(4)為假,而r3c8(3)引出的鏈得到了r4c8(3)為假。這也就意味著,r3c1(3)為假時(shí),可以得到r4c5(4)和r4c8(3)同為假。如果此時(shí)r4c1(1)也為假,就意味著這三個(gè)數(shù)同為假,然后涂色的四格,就都只有2、5、8三種候選數(shù),這顯然是不夠填的,所以r4c1(1)此時(shí)只能為真。所以它是強(qiáng)關(guān)系。
注意一點(diǎn),這里是r4c5(4)和r4c8(3)同為假,如果寫成{r4c5(4), r4c8(3)}的話就要注意里面兩數(shù)是同假的,不要把邏輯搞錯(cuò),然后推導(dǎo)走向了另外一個(gè)錯(cuò)誤的方向。比如之前有人就問我,“r4c5(4)和r4c8(3)這個(gè)整體節(jié)點(diǎn)為假,應(yīng)該是破壞‘r4c5(4)和r4c8(3)同時(shí)為真’的情況,所以應(yīng)該是r4c5(4)和r4c8(3)最多有一個(gè)為真的意思”。這個(gè)說法是錯(cuò)的,因?yàn)橥瑸檎婧屯瑸榧俨⒉皇菍α⒌摹?/p>
最后告訴大家,這里嵌入了一個(gè)四個(gè)單元格,但內(nèi)部有六種數(shù)字的結(jié)構(gòu)。它實(shí)際被叫做二次待定數(shù)組(Almost ALS,簡稱AALS或ALS),就是ALS的待定版本。之前沒有講它的原因是這個(gè)叫做AALS的東西一般不在實(shí)戰(zhàn)里面出現(xiàn),或者出現(xiàn)頻率極少,而且不好觀察到。
2-2?嵌套AUR的動(dòng)態(tài)鏈

如圖所示,這個(gè)鏈厲害就厲害在它帶有一個(gè)AUR。鏈的表達(dá)如下。
可以看到,這個(gè)鏈在表達(dá)上也挺別扭的。假設(shè)r7c4 <> 6,可以一直到r1c6(9),此時(shí)它為假。
當(dāng)r1c6(9)為假的時(shí)候,r1c468(46789)這個(gè)AALS區(qū)域里就變?yōu)榱薃LS,因?yàn)樯倭艘粋€(gè)數(shù),不過依然不能直接用。此時(shí)我們將分兩個(gè)分支討論。
走分支1,可以得到r1c4 = 6的結(jié)果,到這里就結(jié)束了,我們就不再向下走了;
走分支2,可以得到r1c8 = 7的結(jié)果,然后繼續(xù)向下得到r5c8 <> 7、r5c9 = 7。此時(shí)我們這么看。由于r5c9(7)為真,所以我們不妨把r5c9(69)看作整體,它們均為假,所以類似于區(qū)塊來說,它們實(shí)際上整體節(jié)點(diǎn)就是為假的。接著我們發(fā)現(xiàn),如果r5c9(69)和r7c4(6)同假的話,就會(huì)使得r57上的所有6和7都將只能放在r57c23里,使得四個(gè)單元格變?yōu)?和7的隱性數(shù)對,并去掉其它的數(shù)字,也是就形成了UR的致命形式,所以出錯(cuò)了。故它們不同假,即r5c9(69)=r7c4(6)是成立的。
不論分支多少成立,我們能保證其中至少有一個(gè)分支是對的路線。至于為什么說是至少而不是有且僅有呢,因?yàn)樵谖覀兺评淼倪^程里的每一個(gè)節(jié)點(diǎn)都不一定僅通過這一條路徑得到結(jié)論,它們僅僅是建立在假設(shè)成立的前提下可以得到這樣的結(jié)果罷了,所以其它的情況我們并不清楚。所以至少有一個(gè)分支成立,那么結(jié)果里至少有一個(gè)是對的,即r1c4(6)和r7c4(6)里有一個(gè)是對的,所以刪除它們的交集,即c4上的其余位置的6。
此時(shí)請注意,我們還漏掉一個(gè)情況,就是鏈頭r7c4(6)本身成立的情況,但這一點(diǎn)恰好在其中的一條分支上出現(xiàn)了,所以我們不必討論它,但從嚴(yán)謹(jǐn)和客觀的角度出發(fā),實(shí)際上應(yīng)當(dāng)是取r1c4(6)、r7c4(6)和r7c4(6)的交集,即兩個(gè)r7c4(6),一個(gè)表示分支上的節(jié)點(diǎn),而另外一個(gè)則表示鏈頭。
這種“一個(gè)頭兩個(gè)尾”的結(jié)構(gòu)有時(shí)候被稱為多頭鏈(Multi-way Chain)。
我們再來看一則示例,不過這則示例需要你自己推理其邏輯。如圖所示。

Part 3?一些常見的動(dòng)態(tài)鏈定式技巧
接下來我們來看一些基于動(dòng)態(tài)鏈的定式技巧。
3-1?三國爭雄
第一個(gè)技巧的名字很霸氣,而且示例也很新奇。

如圖所示,它實(shí)際上是“三個(gè)頭”的W-Wing結(jié)構(gòu)。由于W-Wing的頭尾都是一樣的形式,所以此處我們隨意找一個(gè)“頭”作為鏈頭開始推導(dǎo)。
假設(shè)r4c3(6)為假,則r4c3(9)真,r9c3(9)假。此時(shí)可以發(fā)現(xiàn)r9還剩兩個(gè)9,我們分情況進(jìn)行討論:假設(shè)r9c4(9)是成立的,那么向上推導(dǎo)能夠得到r3c4(6)為真;但如果假設(shè)r9c6(9)成立的話,那么向上推導(dǎo)可以得到r6c6(6)為真。
所以實(shí)際上這個(gè)問題被轉(zhuǎn)化為了前一節(jié)講到的三頭鏈問題了,刪數(shù)是刪它們的交集,即r4c3(6)、r3c4(6)和r6c6(6)的交集,即r4c4(6)。
這個(gè)技巧被叫做三國爭雄(W-Wing Three Kingdoms)。
3-2?毛刺鏈

如圖所示。鏈表示如下:
這條鏈的刪數(shù)邏輯是,觀察r4c5(6),設(shè)它為真時(shí),可以刪除r9c5(6);設(shè)它為假時(shí),引出鏈,以r9c5(2)起頭,得到r7c6(6)為真,依然可以刪除r9c5(6)。所以r9c5(6)可以刪除。
這個(gè)結(jié)構(gòu)叫做毛刺鏈(Kraken Region |?Cell)。
Part 4?動(dòng)態(tài)鏈的逆向視角
可以看到,動(dòng)態(tài)鏈?zhǔn)蔷哂蟹种У模敲醇热挥蟹种?,就逃避不了一個(gè)問題,如何逆向思考動(dòng)態(tài)鏈的邏輯。
實(shí)際上,動(dòng)態(tài)鏈的逆向視角采用的是逆否命題來得到。我們先思考,動(dòng)態(tài)鏈分哪些情況。實(shí)際上,動(dòng)態(tài)鏈之分兩種:有一種是內(nèi)部有分支,但最終匯總了;還有一種是沒有匯總,形成了多頭鏈。第一種鏈實(shí)際上逆否不會(huì)影響到中間的推導(dǎo)邏輯,因?yàn)殒湹谋举|(zhì)是看頭尾的刪數(shù)交集,而中間在刪數(shù)層面是不關(guān)心的(當(dāng)然,環(huán)除外)。所以第一種情況我們不需要細(xì)致的說明。而第二種不同,它是多個(gè)頭,這就得分方向了。那么我們簡單來使用數(shù)理邏輯的語言證明一下。
假設(shè)這個(gè)三頭鏈,鏈頭有一個(gè),鏈尾有兩個(gè)。那么它的邏輯是“如果鏈頭為假,則兩個(gè)鏈尾至少有一個(gè)為真,則刪除它們?nèi)齻€(gè)端點(diǎn)的交集”。
那么,如果這個(gè)鏈逆向推導(dǎo)呢,邏輯又是如何的?先用邏輯語言把敘述改一下。先設(shè)“鏈頭為真”叫A,“第一個(gè)鏈尾為真”叫B,“第二個(gè)鏈尾為真”叫C。則敘述應(yīng)該是這樣:
若非A,則B或C。
將鏈逆向,則就是逆否命題,即
若非(B或C),則A。
然后,借用德·摩根律拆開括號(hào)。
若非B且非C,則A。
轉(zhuǎn)為自然語言,就是兩個(gè)鏈尾同時(shí)為假時(shí),得到鏈頭為真時(shí),則可以刪除它們?nèi)齻€(gè)端點(diǎn)的交集。那么,更多情況可以自己試試看,實(shí)際上邏輯和推導(dǎo)方式完全和上面的一樣。這里就不再講解了。