一、项目GitHub地址:https://github.com/lc1997622/SudokuProject
二、PSP表格记录:
PSP | Personal Software Process Stages | 预估耗时(分钟) | 实际耗时(分钟) |
---|---|---|---|
Planning | 计划 | 200 | 120 |
·Estimate | ·估计这个任务需要多长时间 | 10 | 20 |
Development | 开发 | ||
·Analysis | ·需求分析(包括学习新技术) | 60 | 120 |
·Design Spec | ·生成设计文档 | 200 | 120 |
·Design Review | ·设计复审(和同事审核设计文档) | / | / |
·Coding Standard | ·代码规范(为目前的开发制定合适的规范) | 120 | 180 |
·Design | ·具体设计 | 120 | 180 |
·Coding | ·具体编码 | 1080 | 1200 |
·Code Review | ·代码复审 | 200 | 60 |
·Test | ·测试(自我测试,修改代码,提交修改) | 200 | 660 |
Reporting | 报告 | ||
·Test Report | ·测试报告 | 60 | 60 |
·Size Measurement | ·计算工作量 | 30 | 30 |
·Postmortem & Process Improvement Plan | ·事后总结,并提出过程改进计划 | 180 | 120 |
合计 | 2260 | 2750 |
三、解体思路:
1、老师限制了可以使用的语言,然后之前看过一点JAVA,就想挑战一下自己,用JAVA写。
2、首先复习了一下JAVA的语法,看在复习的过程中一是复习语法和基础,二是能不能找到一些解体思路。
3、有问题先找搜索引擎,然后去Google了一下,看到一些方法。因为有压力测试,所以算法依旧是核心,权衡之后,生成数独选择随机生成法,自己再优化一下。解数独用了暴力回溯法。
4、其实刚拿到个人项目的时候自己还挺虚的,一是用Java写,没有别人的路可借鉴,遇到什么情况也无法预测,要是写蹦了就更难受了,二是项目的要求是用VS写,我的电脑VS之前删过某个文件,导致不能用了,只能用IDEA。
5、对于性能分析,关键是IDEA能不能做,去Google了一下,有相应的软件和教程,可以实现。
四、实现过程
(吐槽一下,确实坎坷)
1、函数主体图
整个项目分为三个模块:输入输出模块,解数独模块,生成熟读终局模块。
2、代码组织
三个模块分别对应三个类:Sudo(主类)、SudokuPuzzleSolver(解数独)、SudoPuzzleGenerator(生成数独终局)
五、程序性能分析
六、代码说明
1、主类
public class Sudo {
public static void main() {
Options ops = new Options(); //参数设置
if (输入为c) {
try {
/**
* 建立输入输出类对象
* 调用SudokuPuzzleGenerator生成数独
*/
} catch () { } }
if (输入为s) { try {
/**
* 建立输入输出类对象
* 调用SudokuPuzzleSolver解数独
*/
} catch () { } } }
2、生成数独终局
public class SudokuPuzzleGenerator { //生成数独终局
public int[][] generatePuzzleMatrix() { 随机生成并返回
return randomMatrix;
}
private int[] buildRandomArray() {
}
private boolean isCandidateNmbFound() {
/**
* 试着给randomMatrix[row][col] 赋值,并判断是否合理
*/
}
private boolean noConflict() {
return noConflictInRow(candidateMatrix, row, col)&& noConflictInColumn(candidateMatrix, row, col)
&& noConflictInBlock(candidateMatrix, row, col);
}
private boolean noConflictInRow() {
/**
* 因为产生随机数矩阵是按照先行后列,从左到右产生的 ,该行当前列后面的所有列的值都还是0, 所以在行比较的时候,
* 只要判断该行当前列与之前的列有无相同的数字即可。
*
*/
} private boolean noConflictInColumn() {
/**
* 与noConflictInRow(...)方法类似:
*
* 因为产生随机数矩阵是按照先行后列,从左到右产生的,该列当前行后面的所有行的值都还是0,
*
* 所以在列比较的时候, 只要判断该列当前行与之前的行有无相同的数字即可。
*
*/
}
private boolean noConflictInBlock() {
/**
* 为了比较3 x 3 块里面的数是否合理, 需要确定是哪一个Block,我们先要求出3 x 3的起始点。 比如: Block 1
* 的起始点是[0][0] Block 2 的起始点是[3]][0]
*
* ... Block 9 的起始点是[6][6]
*/
}
}
3、求解数独
public class SudokuPuzzleSolver {
/**
* 解数独,并打印结果
*/
public void solve() {
}
/**
* 解数独
*/
private boolean solve() {
}
/**
* 某一行放置数据是否有冲突
*/
private boolean isRowSafe(int[][] grids, int row, int value) {
}
/**
* 某一列放置数据是否有冲突
*/
private boolean isColumnSafe() {
}
/**
* 每个区域是 3 X 3 的子块,是否可以可以放置数据
*/
private boolean isSmallBoxSafe() {
}
/**
* 在指定位置是否可以放置数据
*/
private boolean isSafe(int[][] grids, int row, int column, int value) {
}
}
七、个人总结