首先對需求中的任務一步一步進行分析:
1、題目要求生成不重複的終局至檔案,即首先要知道可生成的數獨終局的上限,該問題在後面詳述。
將終局輸出至檔案需要涉及到相關函式,該問題較為簡單。
2、讀取檔案內的數獨,關鍵在於數獨格式的讀取,因為檔案內數獨格式固定且已知,只需要根據格式編寫相關迴圈使得資料被讀取時考慮到空格和換行即可。
求解為**的主要部分,後邊詳述。
輸出到檔案涉及到函式較為簡單。
1、這裡提到了數獨終局個數為1~1000000,即迴圈或遞迴的上限為1000000。
讀取命令列資料較為簡單。
2、儲存檔案即相關函式。
關鍵在於數獨格式,由於數獨都是9×9,即只需要對中間前8個迴圈輸出,第九個數特判即可。
3、對於特殊情況的處理即判斷輸入是否為1~1000000整數即可。
4、根據題意,我的學號後兩位為37,計算得左上角的數為(3 + 7)% 9 + 1 = 2。
然後就是本題的關鍵——如何不重複生成數獨終局。
分析數獨遊戲的規則:9×9的格仔中填入1~9,要求每行每列不能有重複數字且,每個3×3格仔中也不能有重複數字。
由於左上角的數字固定,即對陣列進行了一定限制。
暫且先不考慮左上角的數字,假設我們已經有了乙個陣列終局,那麼是不是只要依次對換該終局中的每乙個數字,即可實現得到不同終局的目的。
固定第一行,由於第乙個數字已知,即剩下的8個數字有8!種排列,其餘的行裡,如果調換2、3行,4至6行和7至9行,數獨依然成立,這樣總共有8!×3!×3!×2!種組合,大於最大要求,**只需要進行排列的迴圈即可。
1、命令列及檔案讀取以及結果輸出較易實現。
2、讀取檔案中的數獨格式,需要多種判斷語句,但是整體格式比較簡單易於實現。
特別注意記錄0,即空格的位置。
3、又是格式問題,無需多言。
4、著重理解解數獨問題,目前我的思路是用暴力搜尋或者深度優先演算法,爆搜不考慮時間代價的話是很簡單實現的,抱著學習的態度我從網上以及youtube上看了各路神仙對於解數獨問題的思路,結合了poj 2982,總結出來有回溯(深度優先),舞蹈鏈演算法(dlx),候選數演算法等,具體方法選擇之後會說明。
最後附上我學習時的資料鏈結,也供後來人學習奇妙的數獨解法(我覺得我以後看到數獨都會想著怎麼解了)
附:開發psp2.1**
psp2.1
personal software process stages
預估耗時
實際耗時
planning
計畫30
60· estimate
· 估計這個任務需要多少時間
3060
development
開發1200
1590
· analysis
· 需求分析(包括學習新技術)
240240
· design spec
· 生成設計文件
9090
· design review
· 設計複審(和同事審核設計文件)
6060
· coding standard
· **規範(為目前的開發制定合適的規範)
9060
· design
· 具體設計
120180
· coding
· 具體編碼
300600
· coding review
· **複審
120120
· test
· 測試(自我測試,修改**,提交修改)
180240
reporting
報告210
210· test report
· 測試報告
120120
· size measurement
· 計算工作量
3030
· postmoterm & process improvement plan
· 事後總結,並提出過程改進計畫
6060
合計1440
1860
數獨問題解題報告
valid sudoku 九宮格就是要求每一行 每一列 每乙個粗線宮內的數字均含1 9,不重複。所以這裡我們的思路就是一次檢查每一行,每一列中是否有重複的數字如果有則返回false class solution cols for int j 0 j 9 j 當需要分割大的變為小的,可以通過次數來進行...
bitse sudoku 2 數獨求解1
數獨求解的基本方法是根據規則,暴力搜尋。所以先實現了乙個暴力求解版本。在12.21完成,由於考試複習,今天更新部落格。手工求解數獨的過程大概如下 尋找這樣的空格 他所在的行,列,九宮格中已出現八個不同的數字。則剩餘唯一數字必為所填數字。通過不斷尋找,得到解。通過手工方式的啟發,抽象出以下的暴力演算法...
PHP實現的數獨求解問題示例
一 數獨問題描述 對於給出的數字二維陣列,要求每行每列的數字不能重複。二 實現 created on 2017 4 18 class sudoku else function clear function setcell row,col,value col for i 0 i 9 i square ...