GitHub項目地址:
任務:
實現(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ù)流建模


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ù)獨。