我們都多少了解過數獨遊戲,數獨是一種運用紙、筆進行演算的邏輯遊戲。玩家需要根據9×9盤面上的已知數字,推理出所有剩餘空格的數字,並滿足每一行、每一列、每乙個粗線宮(3*3)內的數字均含1-9,不重複。數獨盤面是個九宮,每一宮又分為九個小格。在這八十一格中給出一定的已知數字和解題條件,利用邏輯和推理,在其他的空格上填入1-9的數字。使1-9每個數字在每一行、每一列和每一宮中都只出現一次。
根據專案文件來看,需求是很明確的,即:①生成不重複的指定數量的數獨終局、②求解數獨。
要說是解數獨的方法我倒是聽說過不少,可這突然要求生成數獨終局可真有點難到我了,更何況題目要求能生成100萬個不重複的數獨終局,還需要在六十秒內完成,這對方法的要求就更加嚴格,顯然暴力法是不能採用的。
根據要求首先左上角的數字要固定為9,然後經過仔細思考,根據經驗可以猜測這種數學遊戲通常都是有規律可循的,然後便查閱了一番資料,果不其然,對於乙個待定的數獨終局,在第一行確定的情況下。只要保證從第二行開始,每一行的數字分別是第一行數字右移3、6、1、4、7、2、5、8位,那麼所得到的9×9的數獨終局結果便滿足要求。實際上這裡運用的是數論同餘的原理,每三行的位移量屬於mod 3的同餘類,實際上只要三行位移量在同一mod 3同餘類的不同值就可以了。
那麼由此,只需要構造數獨終局的第一行,然後由其構造剩下的八行。在第乙個數字確定的情況下,第一行剩下8個數字進行全排列,則有8!=40320種結果,然後,對於數獨終局的每三行,任意交換後所得到的結果仍然是滿足要求的,那麼對於每乙個終局,就可以得到2×6×6=72種結果,則一共可以有72×40320=2903040種結果,已經達到了題目要求。
對於數獨的求解,很容易想到的就是深度優先搜尋的暴力求解,以前求解迷宮常常用到這種方法,這種方法**比較簡單,但是效率會低一些。不過這道題目並沒有對求解數獨方面做出過多的效能要求,如果再配合一些剪枝演算法,相信結果應該還可以。
此外,舍友提醒我再判斷每行每列每個九宮格的數字是否重複時,可以採用位運算的方法,可以大大提高程式的效率。
以後有機會的話可以嘗試一下dancing links x演算法。
個人專案數獨
2 每一行都要有1 9這9個數字填入 3 每一列都要有1 9這9個數字填入 4 每一塊都要有1 9這9個數字填入。所以,01模型中列的定義就出來了。i,j,k表示在棋盤上i行j列填入數字k。1到81,表示棋盤中9 9 81個格仔是否填入了數字。如果是,則選取的01行在該01列上有1。對應的01列編號...
個人專案 數獨
個人專案 數獨 再附psp表乙份 personal software process stages 估計耗時 分鐘 實際耗時 分鐘 計畫30 40需求分析 包括學習新技術 00 生成設計文件00 設計複審00 規範00 具體設計 300360 具體編碼 600530 複審 5030 測試200 23...
個人專案 數獨遊戲
數獨 二 生成數獨終局 數獨 三 解數獨 數獨 四 測試與效能分析 數獨 五 總結 數獨 六 ui介面 下面是我預計在專案上花費的時間。psppersonal software process stages 預估耗時 分鐘 實際耗時 分鐘 planning 計畫25 estimate 估計任務用時 ...