軟件工程基礎個人項目--生成數(shù)獨終局并且能求解數(shù)獨問題的控制臺程序-2019-12-24至2019-12-31

GitHub項目地址:

GitHub - KennyH33/sudoku


任務:

實現(xiàn)一個能夠生成數(shù)獨終局并且能求解數(shù)獨問題的控制臺程序


PSP表格

PSP2.1 Personal Software Process Stages 預估耗時(分鐘) 實際耗時(分鐘)
Planning 計劃 60 40
Estimate 估計這個任務需要多少時間 3600
Development 開發(fā) 1200
Analysis 需求分析(包括學習新技術) 600 400
Design Spec 生成設計文檔 100
Design Review 設計復審(和同事審核設計文檔) 60
Coding Standard 代碼規(guī)范(為目前的開發(fā)制定合適的規(guī)范) 60
Design 具體設計 200
Coding 具體編碼 600
Code Review 代碼復審 60
Test 測試(自我測試,修改代碼,提交修改) 360
Reporting 報告 60
Test Report 測試報告 30
Size Measurement 計算工作量 15
Postmortem&Process Improvement Plan 事后總結,并提出過程改進計劃 120

2019年12月28日更新

需求分析:

實現(xiàn)一個命令行程序,程序能:
1.生成不重復的數(shù)獨終局至文件
2.讀取文件內的數(shù)獨問題,求解并將結果輸出至文件

生成終局

1.在命令行中使用-c參數(shù)加數(shù)字N(1<=N<=1000000)控制生成數(shù)獨終局的數(shù)量,例如下述命令將生成20個數(shù)獨終局至文件中:

sudoku.exe -c 20

2.將生成的數(shù)獨終局用一個文本文件(假設名字叫做sudoku.txt)的形式保存起來,每次生成的txt文件需要覆蓋上次生成的txt文件,文件內的格式如下,數(shù)與數(shù)之間由空格分開,終局與終局之間空一行,行末無空格。

9 5 8 3 6 7 1 2 4
2 3 7 4 5 1 9 6 8
1 4 6 9 2 8 3 5 7
6 1 2 8 7 4 5 9 3
5 7 3 6 1 9 4 8 2
4 8 9 2 3 5 6 7 1
7 2 4 5 9 3 8 1 6
8 9 1 7 4 6 2 3 5
3 6 5 1 8 2 7 4 9
···

3.程序在處理命令行參數(shù)時,不僅能處理正確的參數(shù),還能夠處理各種異常的情況,如:

sudoku.exe -c abc

4.在生成數(shù)獨矩陣時,左上角的第一個數(shù)為:(學號后兩位相加)%9+1.例如學生A學號后兩位是01,則該數(shù)字是(0+1)%9+1=2,那么生成的數(shù)獨棋盤應如下(x表示滿足數(shù)獨規(guī)則的任意數(shù)字):

2 x x x x x x x x
x x x x x x x x x
x x x x x x x x x
x x x x x x x x x
x x x x x x x x x
x x x x x x x x x
x x x x x x x x x
x x x x x x x x x

求解數(shù)獨

1.在命令行中使用-s參數(shù)加文件名的形式求解數(shù)獨,并將結果輸出至文件,如:

sudoku.exe -s absolute_path_of_puzzlefile

2.格式如下,其中0代表空格,題目與題目之間空一行,行來無空格,最后一個數(shù)獨題目后無空行:

9 5 0 3 6 7 0 2 0
2 0 7 0 5 0 9 6 0
0 0 6 9 2 8 3 5 0
6 1 0 8 7 4 5 9 3
5 0 3 0 1 9 0 8 2
4 8 0 0 3 5 6 7 1
7 2 4 5 9 0 8 1 0
8 0 0 7 4 6 2 3 0
3 6 5 1 8 2 7 4 9
···

3.sudoku.txt的格式如下(與生成終局的要求相同):

9 5 8 3 6 7 1 2 4
2 3 7 4 5 1 9 6 8
1 4 6 9 2 8 3 5 7
6 1 2 8 7 4 5 9 3
5 7 3 6 1 9 4 8 2
4 8 9 2 3 5 6 7 1
7 2 4 5 9 3 8 1 6
8 9 1 7 4 6 2 3 5
3 6 5 1 8 2 7 4 9
···

4.數(shù)獨題目個數(shù)N(1<=N<=1000000),以保證文件中數(shù)獨格式正確。


功能建模:

這里使用DFD進行面向數(shù)據(jù)流建模

"數(shù)獨處理程序"的頂層圖

"數(shù)獨處理程序"的1層圖

2019年12月31日更新

解題思路:

生成終局

這里參考了xxrxxr的cnblogs軟工博客,使用模板法生成終局,首先生成一個模板終局,因為學號后兩位是01,所以第一個數(shù)字2不能動((0+1)%9+1=2),基本數(shù)獨可以依靠第一行向左分別移動0,3,6,1,4,7,2,5,8位形成九行,也就是一個數(shù)獨,而第一行的個數(shù)是除去2的8個數(shù)字的全排列,即8!=40320種,基本數(shù)獨也是40320種,遠遠不足以達到題目中1000000的要求,這時候需要用到行列交換的方法,但是在這道題中,只需要交換行即可,因為第一個數(shù)字不能動,所以前三個3×3矩陣中只能第二行與第三行交換,也就是整個9×9的矩陣中的第二行與第三行互相交換,但是后面的數(shù)字沒有要求,所以第4,5,6行可以進行互相交換,第7,8,9行可以進行互相交換,這樣一種基本數(shù)獨可以衍生出2!×3!×3!=72個數(shù)獨,總個數(shù)也就是72*40320=2903040個,幾乎是題目要求的3倍多,這樣就達到了題目目的。

求解數(shù)獨

看到題目要求之后我的想法是使用回溯法,即深度優(yōu)先搜索,從第一個0開始,填入1-9中可以滿足需求的數(shù)字,然后繼續(xù),如果遇到9個數(shù)字都無法填入的情況則返回上一個空位用別的數(shù)字代替,以此類推,最后能得到一個解好的數(shù)獨。


剩余博客的更新將在該賬號主頁下用新的文章發(fā)表

2020年1月4日更新
2020年1月8日更新
2020年1月15日的博客更新
2020年1月19日的博客更新

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

友情鏈接更多精彩內容