2020软件工程作业03
这个作业属于哪个课程 | https://edu.cnblogs.com/campus/zswxy/software-engineering-2017-1 |
---|---|
这个作业要求在哪里 | https://edu.cnblogs.com/campus/zswxy/software-engineering-2017-1/homework/10494 |
这个作业的目标 | Sudoku |
作业正文 | 如下 |
其他参考文献 | 百度 |
1.Github项目地址
https://github.com/villanelleshang/dejavu/tree/master/20177618
2.PSP表格
PSP2.1 | Personal Software Process Stages | 预估耗时(分钟) | 实际耗时(分钟) |
---|---|---|---|
Planning | 计划 | 20 | 20 |
Estimate | 估计这个任务需要多少时间 | 30 | 20 |
Development | 开发 | 300 | 400 |
Analysis | 需求分析 (包括学习新技术) | 100 | 50 |
Design Spec | 生成设计文档 | 60 | 30 |
Design Review | 设计复审 | 60 | 20 |
Coding Standard | 代码规范 (为目前的开发制定合适的规范) | 160 | 100 |
Design | 具体设计 | 160 | 40 |
Coding | 具体编码 | 300 | 400 |
Code Review | 代码复审 | 30 | 20 |
Test | 测试(自我测试,修改代码,提交修改) | 100 | 70 |
Reporting | 报告 | 50 | 100 |
Test Repor | 测试报告 | 30 | 20 |
Size Measurement | 计算工作量 | 30 | 10 |
Postmortem & Process Improvement Plan | 事后总结, 并提出过程改进计划 | 30 | 20 |
合计 | 1460 | 1320 |
3.思路
回溯法
首先给出解法的主体,利用回溯的思想。
void backtrace(int n)//回溯法进行填数 { int i; if (n == m * m)//满了就完成填数 { output();//输出结果 return; } int row = n / m; int col = n % m; if (a[row][col] == 0) { for (i = 1; i <= m; i++) { if (check(n,i))//可以填数 { a[row][col] = i; backtrace(n + 1);//进入下一层函数 a[row][col] = 0;//回溯 } } } else { backtrace(n + 1);//进入下一层函数 } }
根据介绍,可以看出填数时需要验证行列以及宫内是否重复,由此
由于357宫格不用验证宫,4689需要验证,check()函数中需要一个判断是否验证宫的部分,若需要验证,则调用check_gong()函数进行验证。
下面给出check函数和检验宫的check_gong函数
bool check(int n,int x)//行和列的验证 { int row = n / m; int col = n % m; int i, j, k=1; for (i = 0; i < m; i++)//验证行 { if (a[row][i] == x) return false; } for(j = 0; j<m; j++)//验证列 { if (a[j][col] == x) return false; } //判断是否需要验证宫 if (m == 4) k = check_gong(n, x, 2, 2); else if (m == 6) k = check_gong(n, x, 2, 3); else if (m == 8) k = check_gong(n, x, 4, 2); else if (m == 9) k = check_gong(n, x, 3, 3); if(k==1) return true; else return false; } bool check_gong(int n, int x, int row, int col)//验证宫 { int i, j; int r = n / m; int c = n % m; r = r / row * row; c = c / col * col; for (i = r; i < (r + row); i++) { for (j = c; j < (c + col); j++) { if (a[i][j] == x) return false; } } return true; }
下面给出3宫格到9宫格的输入输出文件截图
测试图 3456789宫格
Code Quality Analysis分析
Studio Profiling Tools测试
总结
心累