我從高中起就很喜歡數獨這種娛樂方式,喜歡那種為了解出一個數獨的執著,喜歡那份堅持,出于這種心情,我選擇用java來實現一個數獨從無到有的過程。喜愛玩數獨的人應該知道,數獨的限制條件很有意思:首先,一個9*9的九宮格被分成了九個區域,如圖所示,不同顏色區域劃分成不同區域。
圖一
限制條件1:同一個格子內(色塊)不能出現相同的數;
限制條件2:同一行內不能出現相同的數字
限制條件3:同一列內不能出現相同的數字
如何在滿足上述條件的同時,還將這81個格子填滿?這就是我今天要分享給大家的內容。
首先,我們可以將問題簡化一下,我可以先把數字一存放到格子中,然后放置數字二,知道存放數字九,將數字一(二、三、...、九)放入九宮格的過程和八皇后問題非常相似(關于八皇后問題可以查看我上一篇博客八皇后問題),所以現在問題很簡單了,問題就變成了依次將數字1~9放入九宮格,但是,問題不會就這么簡單的,在實現代碼的過程中,我發現,如果在放置數字7的時候,沒有合法的位置(這種情況顯然是存在的),那么現在就需要回溯到上一個數字6了,但是問題出現了,在針對每個數字的回溯的時候,我明確的知道如果一行都無法方式放置,就該回溯了,放第一行沒有合法位置放置,我就該回溯到上一個數字6,但是,回溯到數字6時,我怎么確定回溯到數字5的條件呢?關于這個數值是不確定的,數字6到數字5的閥值和數字5到數字4的閥值肯定是不同的?想了很久還是沒能想象出完美的解決方法,我決定退而求其次,我將閥值設定為100,也就是說,到了100的閥值,我就繼續向上回溯。
本人通過Java代碼是實現了一個數獨的生成,但是,因為本人無法在簡書上將代碼以一種整齊的方式展現給大家,所以,如果有想要程序代碼的朋友可以移步到本人的CSDN:數獨實現。