数独——个人项目(项目地址)

一、项目GitHub地址:https://github.com/lc1997622/SudokuProject

二、PSP表格记录

PSPPersonal Software Process Stages预估耗时(分钟)实际耗时(分钟)
Planning计划200120
·Estimate·估计这个任务需要多长时间1020
Development开发  
·Analysis·需求分析(包括学习新技术)60120
·Design Spec·生成设计文档200120
·Design Review·设计复审(和同事审核设计文档)//
·Coding Standard·代码规范(为目前的开发制定合适的规范)120180
·Design·具体设计120180
·Coding·具体编码10801200
·Code Review·代码复审20060
·Test·测试(自我测试,修改代码,提交修改)200660
Reporting报告  
·Test Report·测试报告6060
·Size Measurement·计算工作量3030
·Postmortem & Process Improvement Plan·事后总结,并提出过程改进计划180120
合计22602750

三、解体思路:

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) {
      
    }

}

七、个人总结




阅读更多
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_40315609/article/details/79967815
上一篇对软件工程基础的目标计划和问题
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

关闭
关闭