zoukankan      html  css  js  c++  java
  • 软工第二次作业——数独

    (1)Github项目地址:https://github.com/CYiFei/chengyifei
    (2)
    PSP2.1 Personal Software Process Stages 预估耗时(分钟) 实际耗时(分钟)
    Planning 计划 60 90
    · Estimate · 估计这个任务需要多少时间 960 900
    Development 开发 120 120
    · Analysis · 需求分析 (包括学习新技术)
    · Design Spec · 生成设计文档
    · Design Review · 设计复审 (和同事审核设计文档)
    · Coding Standard · 代码规范 (为目前的开发制定合适的规范)
    · Design · 具体设计 120 120
    · Coding · 具体编码 120 180
    · Code Review · 代码复审
    · Test · 测试(自我测试,修改代码,提交修改) 90 90
    Reporting 报告
    · Test Report · 测试报告
    · Size Measurement · 计算工作量 30 60
    · Postmortem & Process Improvement Plan · 事后总结, 并提出过程改进计划 60 60
    合计 1560 1620
    (3)解题思路:1首先拿到题目之后,我的想法是先把第一行第一个数确定为9,第一行后面八个数由1到8随机排列。
    2把第二行到第九行所有位置都设为0,然后从第二行第一个依次开始从左到右,从上到下搜索。
    3将所有搜索完成后,检查3*3方格中是否存在违反规则的数字,如果有进行调整。
    找资料过程:直接百度数独算法思路,然后看到了万仓一黍的博客,直接进去看了他的算法思想,看完之后花了一点时间理解,自己根据他的思想再稍加改变,用c++写出了程序代码
    (4)一共三个函数,一个main函数,一个get_Initial_State()函数用来生成数独,一个start()用来初始化。
    (5)代码说明:bool get_Initial_State( int i , int j ) //搜索第( i , j )位置处可以存储的数字,找到解则返回true,否则返回false
    {
    if( i > 9 || j > 9 )
    return true;

    for( int k = 1 ; k <= 9 ; ++k ) 
    {
        bool can = true;                // can 变量用于记录数字k能否放在 ( i , j ) 处 
        for( int m = 1 ; m < i ; ++m ) 
            if( Initial_State[m][j] == k )  // 检查同一列是否出现过数字k
            {
                can = false ;
                break ;
            }
        if ( can ) 
            for( int n = 1 ; n < j ; ++n ) 
                if( Initial_State[i][n] == k )  // 检查同一行是否出现过数字k
                {
                    can = false ;
                    break; 
                }
        if( can ) 
        {
            int up1 = ( i/3 ) * 3 + 3 ; // (i,j)方格所在的3×3小方格i坐标的上限
            int up2 = ( j/3 ) *3 + 3;   // (i,j)方格所在的3×3小方格在j坐标的上限
    
            if( i % 3 == 0 )    //这是针对特殊情况的处理
                up1 = i ; 
            if( j % 3 == 0 ) 
                up2 = j ;
    
            for( int p = up1-2 ; p <= up1 ; ++p  )  /* 检查在3×3的小方格中是否出现了同一个数字 */
            {
                if( can == false )   /* 跳出外层循环 */
                    break ;
                for( int q = up2-2 ; q <= up2 ; ++q ) 
                    if( Initial_State[p][q] == k ) 
                    {
                        can = false ;
                        break ;
                    }
            }
        }
        if( can ) 
        {
            Initial_State[i][j] = k ; 
            if( j<9 ) 
            {
                if( get_Initial_State( i  , j +1 ) )   /* 到同一行的下一位置开始搜索 */
                    return true ;  
            }
            else
            {
                if( i < 9 )  
                {
                    if( get_Initial_State( i + 1 , 1 ) )    /* 到下一行的第一个空格开始搜索 */
                        return true ;
                }
                else
                    return true ;  /* i >= 9  && j >= 9  , 搜索结束 */
    
            }
            Initial_State[i][j] = 0 ;   /* 关键这一步:找不到解就要回复原状,否则会对下面的搜索造成影响 */
        }
    }
    return false ;  /*  1到9都尝试过都不行,则返回递归的上一步 */
    

    }
    (6)测试:
    (7)性能优化:
    (8)PSP2.1 Personal Software Process Stages 预估耗时(分钟) 实际耗时(分钟)
    Planning 计划 60 90
    · Estimate · 估计这个任务需要多少时间 960 900
    Development 开发 120 120
    · Analysis · 需求分析 (包括学习新技术)
    · Design Spec · 生成设计文档
    · Design Review · 设计复审 (和同事审核设计文档)
    · Coding Standard · 代码规范 (为目前的开发制定合适的规范)
    · Design · 具体设计 120 120
    · Coding · 具体编码 120 180
    · Code Review · 代码复审
    · Test · 测试(自我测试,修改代码,提交修改) 90 90
    Reporting 报告
    · Test Report · 测试报告
    · Size Measurement · 计算工作量 30 60
    · Postmortem & Process Improvement Plan · 事后总结, 并提出过程改进计划 60 60
    合计 1560 1620

  • 相关阅读:
    kafka 重启consumer 重复消费问题
    预约系统(十) 预约页面--首页
    预约系统(九) 管理页面--部门管理
    预约系统(八) 管理页面--会议室管理
    预约系统(七) 管理页面--用户管理页面
    预约系统(六) 管理页面首页
    预约系统(五) 管理页面框架 密码修改和用户信息功能
    重读C# -- 1.net体系结构
    预约系统(四) 管理页面框架搭建easyUI
    预约系统(三) 登录功能和验证码
  • 原文地址:https://www.cnblogs.com/CYiFei/p/7538801.html
Copyright © 2011-2022 走看看