首页 > 技术文章 > 软工第二次作业——数独

CYiFei 2017-09-17 23:52 原文

(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

推荐阅读