數獨分析

數獨這種遊戲,我在很久之前就接觸過了,也做過不少的題,對於以人的思維解數獨,我是非常熟悉的。當然,我做的題也不是多難的,一般都是30多格的,中等難度,且不需要Brute Force(也就是猜測)的題目。

一般按人的思維,常用的方法有三個:1.摒除法,2.唯餘法,3.強弱鏈。

摒除法就是通過哪些格子不能填這個數從而得到一個唯一的這個數的填法;唯餘法就是通過分析這個格子不能填什麼數而得到這個格子的唯一填法;強弱鏈則是通過分析數字與數字之間的邏輯關係而得到答案。

當然,對於計算機而言,猜測法纔是最爲實用的,DFS遞歸暴力破解。

在此之前,我只是做過數獨,卻從來沒有對數獨進行過研究。在這次需要寫關於數獨的算法,所以我又去仔細研究了數獨,對數獨有了一些新的瞭解。

1.數獨的終盤個數

數獨的終盤到底有多少個呢?在網上查到的準確數字爲6670903752021072936960,6.67乘以10的21次方。我最初只知道這個數字,卻不知道它是怎麼得出的,爲了研究它,我對它進行了因數分解,看看能否得到什麼有趣的規律。最後,得到了一個奇怪的答案:6670903752021072936960=2^20*3^8*5*7*27704267971。在分解了半天之後分解不出任何因子之後,我決定用電腦驗證。我從1驗證到了1億,依然沒有發現任何因子。這個結論告訴我,這個2.77e10的數是個質數!這是什麼原因?最後我找到了當初得到數獨終盤數的Stanley E. Bammel和Jerome Rothstein這兩位數學家的網站,網址如下點擊打開鏈接,纔得到了最後的答案。數獨的終盤個數不像魔方一樣,可以通過計算算出來,數獨的終盤個數最終是由計算機枚舉而得到的!它最終是由各個情況的組合數相加而得到,所以纔可能出現那樣一個龐大的質數因子。所以數獨終盤有什麼數學上的規則麼?好像沒有。

2.由一個獨立解所能生成的終盤數

對於每個獨立的數獨終盤,都有
(1).調換數字(9!=362880)
(2).旋轉棋盤(4)
(3).調換棋盤,在每三行(或列)中交換順序(6^4=1296)
(1):所謂的調換數字,就是說數獨中每個數字都是完全等價的,將1與2調換,或者1換爲2,2換爲3,3換爲1都不會破壞該終盤。所以,通過數字調換,第一個數有9種,第二個數有8種,第三個有7種,...,最終共有9!=362880種調換方法。這些終盤之間顯然是兩兩不同的。
(2):這個需要聯繫第一個調換數字一起理解。因爲所有數字都是等價的,所以我們可以選擇將左上角的九宮格內換爲123456789順序排列(在Stanley E. Bammel和Jerome Rothstein枚舉終盤數時就是用了這樣的方法鎖棋盤,保證數調換不重複)。這時候,排除了第一種的干擾之後,我們就能得到,將基準選在4個角的情況是不同的,它們之間互相干擾,不會同存。所以也就是說,通過旋轉棋盤,可以得到4種不同的解。
(3):首先,我們發現,在1~3,4~6,7~9,行之內互相調換,是不會破壞終盤的,我稱之爲調換棋盤。但是不能隨意調換,如果我們將基準鎖定在左上角,我們會發現,換前三行或前三列時會與(1)的調換數字有衝突(將行調換視作將上下三個數互換,這將與另一組數調換的情況完全一樣)。所以左上角的鎖定是不能改變的。這樣,只有4~6行,7~9行,4~6列,7~9列可以換,一共6^4=1296種情況。
所以最後一共有9!*4*6^4=1881169920種交換方法,大約18.8億。用這種方法顯然是可以完成100w的題目要求的,即使不用(2)和(3)的手法,僅排列組合調換數字,再加上提前存3個不同的終盤,這樣即可生成1088640種>100萬的終盤。同時,這樣的速度也將是最快的,按順序打表輸出即可,不需要任何計算,完全不用考慮所生成終盤的合理性。但是這樣喪失了出題的隨機性,每個終盤的相對位置都是一樣的。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章