1. 程式人生 > >用程式解九宮格數獨

用程式解九宮格數獨

關於給定不完整數獨的解有三種情況:

1,數獨中的數字有衝突,無解。

2,數獨中的數字沒有衝突,並且有且只有一個解。

3,數獨中的數字沒有衝突,有多個解。

以上三種情況是得到不完整數獨的解,所面對的情況。

1,1 設想一個不完整的數獨有衝突數字。在進行填數字前,就要判斷出來。然後報告這個數獨有衝突數字。

2,2 設想一個不完整的數數獨有唯一數獨解,那麼每一個格中的數字都是唯一確定的。只是我們不知道是具體數值。那麼我們就可以先找出這種唯一確定的數字啦。

3,3設想一個不完整的數獨有多個解,那麼可以先找出唯一確定的那些數字位置。然後剩下的空方格就有多種情況了。

其中數獨有多少種可能呢? 如果是9x9的格式,則有十的八十一次方中可能數獨(含有衝突項)。

難度第一簡單思路:

所以使用暴力的方式進行一一列舉,嘗試得到一個不完整數獨的解,似乎不太可能。於是,猜想應該排除有衝突的數獨。

難度第二簡單思路:

這時,思路有了。當嘗試向數獨中填入一個數字X(隨便取的一個變數名)時,要判斷X不與已經存在的數字重複(衝突)。

其中以上的數字重複包括,X所在的行不重複,X所在的列不重複,X所在的小九宮格不重複。然後再嘗試下一個數字的填入。這種思路可以得到數獨的解,仔細像,好像存在漏洞。填入數字有可能重複。沒有排除已存在項(具體操作有點麻煩,不建議用遞迴實現(記憶體佔用過多))。

難度第三簡單思路:

這是由2.2的說明可知,可以優先填入這種唯一確定的數字空格。當然上一次的填入會對當前這次的填入產生影響。這就促進了當前這一次的填入。如此迴圈填入唯一確定數字,就可以將所有的唯一確定值填完了。如果此時數獨已經填完整了,那麼這就是一個唯一確定的數獨。否則就是一個多種解數獨。

補充:如果是多解數獨那麼可以參照難度第二簡單思路得到一個完整數獨。

關於以上思路程式(window版 android版)上傳到了taocode平臺上。http://code.taobao.org/svn/shudu_programe/ 或者 http://code.taobao.org/p/shudu_programe/wiki/index/