2020软件工程作业03
软件工程 |
https://edu.cnblogs.com/campus/zswxy/software-engineering-2017-1 |
---|---|
作业要求 |
https://edu.cnblogs.com/campus/zswxy/software-engineering-2017-1/homework/10458 |
作业目标 |
|
作业正文 |
|
参考文献 |
一.github地址
进行穿越
二.PSP表格
PSP2.1 | Personal Software Process Stages | 预估耗时(小时) | 实际耗时(小时) |
---|---|---|---|
Planning | 1 | 0.5 | |
Estimate | 24 | 48 | |
Development | 3 | 3 | |
Analysis | 3 | 5 | |
Design Spec | 2 | 2 | |
Design Review | 1 | 0.5 | |
Coding Standard | 0.5 | 0.5 | |
Design | 1.5 | 2 | |
Coding | 6 | 8 | |
Code Reviewt | 1 | 1.5 | |
Test | 2 | 3 | |
Reporting | 3 | 4 | |
Test Repor | 1 | 1 | |
Size Measurement | 0.5 | 0.5 | |
Postmortem & Process Improvement Plan | 0.5 | 0.5 | |
合计 | 50 | 80 |
三. 解题思路
刚拿到作业,光是看题目并且弄懂都用了不下十分钟,数独吗?没玩过,年轻人都爱玩这个了?行吧行吧,玩两把体会下...(过了良久)这玩是会玩了,但是怎么让代码去玩呢?题目是三到九宫格,3,5,7不考虑宫,只判断每行每列不重复,而4,6,8,9都要考虑。总体看来,首先要实现算法,然后解决输入文件名以命令行参数传入。头脑风暴下,知道的算法有采用区块摒除法,唯一余数法,递归调用,回溯法,还是用回溯法(其实是别的不熟悉)(参考详解八皇后问题)能进则进,不进则退,退一步海阔天空,尽管回溯法也算是暴力方法,但也不是特别暴力,特别暴力的相关部门都不让播,能播的都是可以接受的暴力。就在沾沾自喜问题解决一大半时,才发现这只是个开始,最麻烦的其实是文件读写和命令行传参,于是此处参考( Java读取txt文件和写入txt文件)。
四.设计与实现过程
1.各方法函数
2.流程图
五.代码改进
1.静态分析(阿里巴巴代码规范工具)
经过一顿操作,而后属实大快人心,也发现了主要不规范的地方是方法命名和注释的规范,还有未定义的常量,所以应该
多注意,养成良好的编程习惯。
2.性能分析(jprofile11.1试用10天本来要到了,感谢瑞哥带来的key)
3.单元测试
本次单元测试采用静态测试,即通过人工分析证明的方式来确认程序是否有问题。
3 ,5 ,7宫格
4宫格
6宫格
8宫格
9宫格
关于异常处理
原来是数组越界问题,显然这个数不在我建的数组范围之内,所以提示数组越界
把代码改成int generateSudoku[][]=new int[10][10];
成功!!
六.代码说明
1.cheak方法
for (int i = 0; i < m; i++) {
/**如果行中列中有重复数,则返回false,用于3,5,7宫格*/
if (i != x && Shudu[i][y] == n) {
return false;
}
if (i != y && Shudu[x][i] == n) {
return false;
}
}
if(m==3)
{
return true;
}
else if(m==4){
int tempRow = x / 2 * 2;
int templine = y / 2 * 2;
for (int i = tempRow; i < tempRow+2; i++) {
for (int j = templine; j <templine+2; j++) {
if (i != x && j != y && Shudu[i][j] == n) {
return false;
}
}
}
}
else if(m==5){
return true;
}
else if(m==6){
int tempRow = x / 2*2;
int templine = y / 3*3;
for (int i =tempRow; i < tempRow + 2; i++) {
for (int j = templine; j < templine + 3; j++) {
if (i != x && j != y && Shudu[i][j] == n) {
return false;
}
}
}
}
else if(m==7){
return true;
}
else if(m==8){
int tempRow = x / 4 * 4;
int templine = y / 2 * 2;
for (int i = tempRow; i < tempRow + 4; i++) {
for (int j = templine; j < templine + 2; j++) {
if (i != x && j != y && Shudu[i][j] == n) {
return false;
}
}
}
}
else if(m==9){
int temprow = x / 3 * 3;
int templine = y / 3 * 3;
for (int i = temprow; i < temprow + 3; i++) {
for (int j = templine; j < templine + 3; j++) {
if (i != x && j != y && Shudu[i][j] == n) {
return false;
}
}
}
}
return true;
}
用cheak方法先判断行列中有重复数,符合3.5.7宫格,然后再此基础上判断不同小宫是否有重复,如9宫格可以分为9个小的3宫格,以此推理出其他宫格。当然,在你划分小宫时有不同的方法,可以从点出发,也可以从行列的角度出发,依据个人喜好。
2.回溯法matrixbackTrace
int x = k / m;
int y = k % m;
if (matrix[x][y] == 0) {
for (int i = 1; i <= m; i++) {
matrix[x][y] = i;
if (cheak(matrix,x, y,i, m)) {
matrixbackTrace(k + 1,m);
}
}
matrix[x][y] = 0;
} else {
matrixbackTrace(k + 1,m);
}
}
回溯法是本次代码的解数独关键,在代码中,如果matrix[x][y]==0,这个点是空的,那么才进入给空格填值的逻辑,判断给(x,y)这个位置放1-m中的任意一个数是否能满足规则,然后将该值赋给该空格,然后进入下一个空格,如果该位置已经有值了,就直接进入下一个空格进行计算。参考( 回溯算法解数独问题)。
3.写入文件
try{
String outfile="E:\\output9.txt";
FileWriter fw = new FileWriter(outfile,true);
for(int i=0;i<m;i++){
for(int j=0;j<m;j++){
fw.write(matrix[i][j]+" ");
}
fw.write("\r\n");
}
fw.write("\r\n");
fw.close(); /** 关闭 */
}
}
调用回溯法解数独。
七.心路历程
结束了,首先就把PSP表格里的单位分钟改为了小时,不是为了偷懒少打数字,而是真的只能以小时为单位。学到了很多东西,也找到以前存在却没发现的错误,刚开始输入命令行参数,一直都显示是无用命令,突发奇想,输入java和Javac试试,果然发现问题就是javac。因为路径被覆盖了找不到,于是( javac不能运行怎么办?),怎么说呢,百度确实是个好工具。复习了一遍Java的文件读写操作知识和其他语法的使用,受益匪浅,也对算法有了新的认识,继续码农,多学多练。