(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