基本的數獨邏輯推斷規則與數獨謎題難度等級

——《 》

時隔幾日,再以彼文為基礎,做一補充和完善。

且先看調整後的自制“數獨謎題難度等級表”:


基本的數獨邏輯推斷規則與數獨謎題難度等級

新版自制“數獨謎題難度等級表”


為了準確說明幾日來的辛勞和調整背後的深層原因,且容慢慢道來。

(一)問題討論的前提

基於標準數獨(也即九宮數獨,共有九九八十一個單元格)展開討論;

基於有唯一解的數獨謎題展開討論;

基於四種基本的數獨邏輯推斷規則界定單元格的類型。

(二)何為“四種基本的數獨邏輯推斷規則”?

1.唯餘法。其實我更喜歡叫做“唯一候選數法”,大意是:根據數獨“同行數字1到9不重複、同列數字1到9不重複,同宮數字1到9不重複”,可以得出每個空單元格的可填數,也就是候選數,如果某個空單元格的候選數只有一個,那麼該空格即被“邏輯斷定”。示例如下圖 (特別聲明,本文用到的關於數獨技巧講解的圖片均引用自知乎專欄《小向的標準數獨技巧教程》,在此向原作者表示敬意):


基本的數獨邏輯推斷規則與數獨謎題難度等級

唯餘法


可見:金色單元格(r1c4)被同列(c4)排除了數字2、3、4、5,被同行(r1)排除了6、7、9,被同宮(b2)排除了8(只取不重複的數字),於是只剩下一個數字1可填,故而利用“唯餘法”該空格被邏輯斷定。

2.行排除。示例如下:


基本的數獨邏輯推斷規則與數獨謎題難度等級

行排除


金色單元格(r1c2)的同行(r1)還有另外兩個單元格(r1c68),根據上面的唯餘法,金色單元格的候選數只有兩個:5、6(其中同行r1排除1、2、3、4、7、8,同宮b1排除9),注意到,6既不能填進(r1c6),也不能填進(r1c8),因為6均是同行r1另外兩個空格的排除數,見藍色單元格。故而,金色單元格(r1c2)只能填數字6,因為如果填5的話,會讓同行其他空格“無數可填”。

3.列排除。示例如下:


基本的數獨邏輯推斷規則與數獨謎題難度等級

列排除


列排除其實與行排除等價,只要將數獨盤面左旋或右旋90度即可彼此轉化。上圖列c6中有5個空格(r34679c6),(r3c6)、(r4c6)、(r7c6)、(r9c6)的排除數中均有7(藍色單元格),故而金色單元格(r6c6)只能填數字7。

4.宮排除。示例如下:


基本的數獨邏輯推斷規則與數獨謎題難度等級

宮排除


上圖中,宮b4中有5個空格,第一宮列中的兩個空格被列c1中的數字5(藍色單元格(r1c1))排除,第二宮行中的兩個單元格被行r5中的數字5(藍色單元格(r5c9))排除,故而剩餘的金色空格(r4c3)只能填數字5。

以上便是“四種基本的數獨邏輯推斷規則”。說“基本”是因為它們是由數獨遊戲規則直接衍生出來的、最易被普羅大眾理解和運用的、學習成本最低的、具有基礎地位的推斷規則。除此而外,還有許多名稱中含“區塊、數組、鏈”等字眼的高大上的、唬人的、更為生猛、高效的數獨推斷規則,我也不懂,因為對這些技巧實在擠不出“高性價比”的時間了。

(三)數獨盤面單元格類型的劃分

1.提示格或已知格。構成了數獨謎題的謎面。同前文所述,要確保數獨謎題“有解且只有唯一解”,提示數最少是17格,關於“16格數獨謎題沒有唯一解”是已經被計算機暴力證明(非數學的邏輯證明)的事實。

2.唯一格或斷定格。空單元格中最簡單的情形,也即可填數(或候選數)只有一種可能的空格,這種格子的多寡不光與提示數的多寡相關聯,也依賴於所採用的“數獨邏輯推斷規則”的類別和數量。本文界定“斷定格”是基於上述“四種基本的數獨邏輯推斷規則”,可以設想,如果使用更高明、更復雜的“數獨技巧”,斷定格說不定會更多一些。

3.試填格或遞歸格。剩下的空格是令人抓狂的,候選數的可能情形有2個到9個不等,人工破題時,可能需要用鉛筆在盤面上標註小數字進行標記或試填,幫助進行下一步的分析,通過“假設—尋找矛盾”的辦法慢慢斷定。用計算機處理時,則是使用“遞歸”的辦法,形成一種“樹狀搜索”。好的算法處理,會盡量將這棵搜索樹引導成一棵“二叉樹”,或者是將這棵搜索樹的“最大子樹”引導成一棵“二叉樹”,這是出於提高算法效率的考慮。

關於“二叉樹”,我前面發過一篇文章,可資瞭解:

——《 》

我在前文中說過,我談論“數獨”的基礎是做過一些計算機數獨解法的實踐。現在我的算法已能輕鬆應對幾乎所有的數獨謎題了,平均速度均在1秒以內,在我所測試的記錄中,範圍是:0.03~1.86秒之間,超過1秒的星星點點。

(四)我理解的數獨謎題難度等級

顯然,我是以“遞歸格數量從多到少、唯一格數量從多到少”的基本原則將數獨謎題由難而易劃分的。

唯一格現在很好處理,最少1格(只需從一個數獨終盤上隨便挖掉一個數字即可),最多64格,以前我猜測“唯一格太多估計不存在”是錯誤的,原因是我沒有做足夠多的測試。其實,截止今天發文,我已經測試了四五百道數獨謎題,其中有一個知名來源:

http://163.19.32.13/~sudoku/

(49151道17格數獨謎題)

我發現了唯一格為64格的大量數獨謎題,下面列舉3個:


基本的數獨邏輯推斷規則與數獨謎題難度等級

64格唯一格1


基本的數獨邏輯推斷規則與數獨謎題難度等級

64格唯一格2


基本的數獨邏輯推斷規則與數獨謎題難度等級

64格唯一格3


因此,我將唯一格64格均分為四級,每級16格,得到難度等級1、2、3、4級,0級專門給那些大量的多解的數獨謎題準備。當然,這不是一個完備的劃分,因為還有“符合數獨規則”的無解的題目和“不合數獨規則”的錯題的存在,如圖:


基本的數獨邏輯推斷規則與數獨謎題難度等級

無解


基本的數獨邏輯推斷規則與數獨謎題難度等級

錯題


令人頭疼的是遞歸格的處理,目前經過大量測試我找到的範圍是:13~61格,如圖:


基本的數獨邏輯推斷規則與數獨謎題難度等級

13格遞歸格1


基本的數獨邏輯推斷規則與數獨謎題難度等級

13格遞歸格2


基本的數獨邏輯推斷規則與數獨謎題難度等級

61格遞歸格


請不要認為我只是輕鬆的試了一下,為此我花了大量的時間驗證,現在我甚至敢於給出以下猜測或結論:

1.基於四種基本的數獨推斷規則的遞歸格數最少是13格。

(重要程度★★★★★)

有兩種數獨技巧叫做“同數八缺一”、“同區八缺一”,如下圖:


基本的數獨邏輯推斷規則與數獨謎題難度等級

同數八缺一


可見,盤面已經有了8個6,剩餘不衝突的金色單元格只能填6,叫做“同數八缺一”,其實,盤面已經排除了“八行八列”。


基本的數獨邏輯推斷規則與數獨謎題難度等級

同區八缺一


可見,r8區只缺數字5了。

可以想見,這兩種所謂技巧其實包含於上面四種基本技巧之中,頂多是其特例。現在我想說的是:盤面剩餘9個空格時,絕對是可以被“邏輯斷定”的,就是因為上面兩種特例技巧的存在。請您仔細思考,直白點就是:遞歸格的數量不可能是:1~9格。

接著,我們反過來思考:如何防止出現“同數八缺一”、“同區八缺一”的情況出現,最少需要空多少格?

首先滿足不出現“同區八缺一”,我們就讓它缺兩個,比如:

有:1、2、3、4、5、6、7

缺:8、9

然後,為了防止8出現“同數八缺一”,我們再缺一個8,同理,再缺一個9,於是我們又至少缺了4個。現在一共缺9+4=13個。

雖然,我這推理或許不夠嚴謹,但是我相信絕對是正確的!我敢於冒著“被無情打臉”的風險,在此放下豪言:不服找出反例!!!

2.基於四種基本的數獨推斷規則的遞歸格數為62、63、64格的唯一解數獨謎題不存在,換言之任意唯一解數獨謎題的任意17提示格均能至少邏輯斷定3個空單元格。

(重要程度★)

呵呵,這條結論我是完全瞎猜的。一是基於苦苦找尋總是找不到,二是出於對稱和最終制成“數獨謎題難度等級表”的需要。哪裡對稱?刨除格數1~9,剩餘55種格數中,兩端各有3種格數不可能,分別是:10、11、12格,62、63、64格,可能格數範圍是:13~61格,共49種情形,且基本都被我找到了,難道不對稱、不完美嗎?


基本的數獨邏輯推斷規則與數獨謎題難度等級

遞歸格數分佈表


順便提一句:兩端格數13、17、22、23、24,53、54、56、58、59、60、61的我都找到了,本想把所有的分佈逐個統計一下,無奈這個想法是在大量測試完成後意識到的,就留待以後驗證吧。說不定,像14、15、16、21、55這樣的格數也是不存在的,也未可知。

願意接受眾網友的板磚和指教。再會。


基本的數獨邏輯推斷規則與數獨謎題難度等級


分享到:


相關文章: