第10講:規則Wing結構
這一講將會講解的是一種以分情況討論作為核心思想的技巧。
Part 1 雙分支匹配法(XY-Wing/Y-Wing)
如圖所示,我們觀察到,r1c2隻有兩種填數情況:3和8。
- 如果r1c2=3,則r5c2=4;
- 如果r1c2=8,則r2c3=4。
那麼,不管是其中哪種情況,最終r5c2或r2c3至少一格會填4。所以,不論怎麼個情況,它們兩個共同對應的地方,都不能填入4了。所以,r2c1, r6c3<>4。
這個技巧的推導過程就講完了。不過,你可能會向我提出兩個問題:
- 為什麼是「至少一格填4」,而不是「有且僅有一格填4」?
- 「共同對應的地方」到底是什麼地方?
那麼下面我來一一闡述一下。
首先是問題1。我們按照假設來看的話,要麼r1c2填3,要麼r1c2填8。如果至少一格填4,意味著還有可能r5c2和r2c3兩格同時為4,這意味著r1c2得同時既填3又填8的時候,才可能讓兩格同時為4。可是一個單元格怎麼可能填兩個數,這是違背常理的呀。
別忘了。雖然r1c2填其中一種情況只能得到其中一個單元格是4,就比如說,當r1c2是3的時候可以得到r5c2是4,但這並不代表當r1c2不是3的時候,r5c2就一定不是4。
這也就是說,r1c2不是3的時候,r5c2也可能是4。所以,完全有可能r1c2是8(不是3)的時候,r5c2和r2c3都是4。
不知道我解釋清楚沒有哈,如果有問題的可以繼續提問。
問題2。共同對應的地方,表示兩個單元格都能夠「看」到的位置。說白了呢,某個單元格所在的行、列、宮的其餘單元格(也叫相關格組或等位群格位),它都能「看」到。比如這裡的r3c123和r456c3,就是r2c3和r5c2都能看到的地方。更精確一些呢,{r3c123, r456c3}(4)就是r2c3(4)和r5c2(4)都能看到的地方。理解了共同對應一詞了嗎?
那麼為什麼共同對應的地方就不能是4了呢?這問題你得反過來想。如果共同對應的地方但凡出現填4的情況,就會同時使得r5c2和r2c3都不能再填4(數獨規則要求每一個行列宮都不能存在有重複的數字),這樣必然違背最開始說到的「至少一格是4」的要求。所以這些位置必然不能是4,也就刪除掉它們。
那麼,這個結構叫做XY-Wing。它有中文名嗎?應該是有的,不過名字沒有英文聽起來霸氣:雙分支匹配法。一般來說,這技巧都不用中文名(主要的是知道它中文名的太少了,網上資料也不是非常的全面)。制定這個名稱的原因和X-Wing(二鏈列)類似,X和Y分別指的是裡面的兩個數,即r1c2的3和8,至於你覺得x=3還是y=3,都無所謂,反正都是一樣的。那提到名字問題了呢,就順帶說一下。這名字是因為作標題才大寫的,平時寫為xy-wing是沒有問題的,同樣地,x-wing這麼寫也是沒有問題的。不過連字元號最好還是別漏了,把wing看成一種特定結構的名稱就好。另外,XY可以簡寫為Y,即Y-Wing(如果你知道這個名字有歧義,請暫時不要去糾結名字的問題,到了後面我會詳細闡述名字的由來)。
Part 2 三分支匹配法(XYZ-Wing)
很好,看完了第一節,應該知道一些東西了。那麼接著來看XY-Wing的拓展版本。
如圖所示,這個結構是不是似曾相識呢?沒錯,這個結構我們這麼去理解:
- 如果r3c2=4,則r7c2=1;
- 如果r3c2=9,則r3c1=1;
- 最後還有一種情況是r3c2=1。
我們發現,無論如何,在r3c12和r7c2之中,至少有一格是1。所以,它們共同對應的地方(都能看到的地方)就不得再填1了。三個單元格都能看到的地方只有r12c2,所以r12c2<>1。當然了,r2c2是確定值,根本不用刪。
那麼,這個技巧有三種情況,所以就叫三分支匹配法(XYZ-Wing)。注意,這裡XY就別簡寫了,XYZ表示結構的三種數字,其中的z=1,x和y則隨意~
Part 3 四分支匹配法(WXYZ-Wing)
還有比剛才「三分支」更大的結構。
這個結構稱為四分支匹配法(WXYZ-Wing)。假設情況則為:
- 如果r1c8=2,則r1c9=5;
- 如果r1c8=4,則r6c8=5;
- 如果r1c8=6,則r7c8=5;
- 還有一種情況是r1c8=5。
四種情況最終得到的是,四個單元格r1c89和r67c8之中,至少一格是5,所以四個5都能對應到的地方,就不能是5了。那麼即r2c2<>5。
那麼,這裡的三種結構也就講完了。由於英文裡面三者都有wing一詞,所以稱為wing結構。But,wing結構並沒有完,還有一類結構也屬於wing,但由於知識點暫時還沒有介紹到,所以剩下的一類wing結構被放在了後面的某一講。這裡為了區分wing結構的分類,我將這種可以直接分情況討論的,稱為規則wing(Regular Wing),而剩下的wing結構呢,則叫不規則wing(Irregular Wing)。
最後留下一點兩個小問題。
/// <summary>/// 畫分割線。/// </summary>/// <returns>返回分割線對應文本。</returns>public static StringBuilder PrintLine(){ StringBuilder s = new StringBuilder(); // 新建一行。 for (int i = 0; i < 20; i++) // 做 20 次同樣的動作。 { s.Append("-"); // 輸出一個橫杠。 } s.Append("
我是華麗的分割線
"); // 輸出一行文字。 for (int i = 0; i < 20; i++) // 做 20 次同樣的動作。 { s.Append("-"); // 輸出一個橫杠。 } return s;}// 測試結果:// --------------------// 我是華麗的分割線// --------------------
叮叮叮~~~ 下面是測試時間!
1、以下結構是否正確?
2、只關心結構是否可以存在,那麼規則wing結構最多可以有多少個分支呢?
答案:
1、以下結構是否正確?(圖片見上方)
其實是正確的。根據原定的分析方式,將r4c2的三種填數情況依次進行分析,最後發現,在r4c4、r6c13這三格內,至少有一格填3。所以,它們都能看到的地方(共同對應的地方),就不能填3了,否則一定會和其中某一個填3的單元格在共同所在的區域下重複。故r6c4<>3。
2、只關心結構是否可以存在,那麼規則wing結構最多可以有多少個分支呢?
最多可以到9個分支。雖然這感覺上基本不可能,而且目前沒有實例可以說明這一點。不過構型大致是這樣的:
.-------------.-------------.-------------.| 1~9 | 26 27 | 28 29 || 12 23 | | || 24 25 | | |:-------------+-------------+-------------:| | | || | | || | | |:-------------+-------------+-------------:| | | || | | || | | |---------------------------------------
這個結構就是可行的。刪掉r1c23(2)。
另外啰嗦一個東西哈,之前的結構我們發現了神奇的亮點,就是結構每增大一個單位,它的中文名就會增大「1」,而英文名則會增加一個英語字母,即從xy到xyz,再到wxyz(因為z後排完了嘛,常見的設的未知數的三個字母都用光了,所以就向前面再補充字母了)。那麼猜也應該猜得到,最大的九個分支的結構叫做九分支匹配法(RSTUVWXYZ-Wing)。老外取名是不是很有趣呢?
Part 4 總結
這一節是針對講到的技巧做的一個統一的難度歸納和理論分析。
- 雙分支匹配法
- 英文名:XY-Wing
- 難度係數:4.2
- 命名空間:
Tech.Chain.Wing.Regular.Double
- 三分支匹配法
- 英文名:XYZ-Wing
- 難度係數:4.4
- 命名空間:
Tech.Chain.Wing.Regular.Triple
- 四分支匹配法
- 英文名:WXYZ-Wing
- 難度係數:4.6
- 命名空間:
Tech.Chain.Wing.Regular.Quadruple
使用到的術語:
- 看
- 英文名:See
- 解釋:一個單元(元素),所可以「影響」到的範圍。對於某個候選數而言,它所在的單元格,所處的行、列、宮的其餘單元格,以及它自己所處單元格下的其餘候選數,都是這個候選數可以看到的地方;而對於單元格而言,就只能看到它本身所在的行、列、宮的其餘單元格了。
推薦閱讀:
※第15講:全雙值格致死解法
※第13講:拓展矩形和唯一環
※第11講:唯一矩形(基本構型)
※第22講:不規則Wing結構
TAG:數獨 |