在我的观察看来,你远远不够努力;如果你觉得你已经很努力了,只能说明你不适合做这一行。

2020软件工程作业03

软件工程 https://edu.cnblogs.com/campus/zswxy/software-engineering-2017-1
作业要求 https://edu.cnblogs.com/campus/zswxy/software-engineering-2017-1/homework/10458
作业目标
完成一个数独命令行程序
作业正文
见下文
参考文献
https://www.CSDN.com/

一.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的文件读写操作知识和其他语法的使用,受益匪浅,也对算法有了新的认识,继续码农,多学多练。

posted @ 2020-03-29 17:22  石三88  阅读(303)  评论(1编辑  收藏  举报