这个作业属于哪个课程 | https://edu.cnblogs.com/campus/zswxy/software-engineering-2017-1 |
---|---|
这个作业要求在哪里 | https://edu.cnblogs.com/campus/zswxy/software-engineering-2017-1/homework/10494 |
这个作业的目标 | 画自己最想学的技术的学习路线图 |
作业正文 | https://www.cnblogs.com/linjin0806/p/12582098.html |
其他参考文献 | https://www.baidu.com |
Github项目地址:https://github.com/linjin66/sudoku
PSP表格
PSP2.1 | Personal Software Process Stages | 预估耗时(分钟) | 实际耗时(分钟) |
---|---|---|---|
Planning | 计划 | 120 | 120 |
Estimate | 估计这个任务需要多少时间 | 3600 | 7200 |
Development | 开发 | 60 | 120 |
Analysis | 需求分析 (包括学习新技术) | 60 | 120 |
Design Spec | 生成设计文档 | 60 | 120 |
Design Review | 设计复审 | 60 | 60 |
Coding Standard | 代码规范 (为目前的开发制定合适的规范) | 60 | 60 |
Design | 具体设计 | 120 | 120 |
Coding | 具体编码 | 120 | 240 |
Code Review | 代码复审 | 120 | 240 |
Test | 测试(自我测试,修改代码,提交修改) | 60 | 60 |
Reporting | 报告 | 120 | 120 |
Test Repor | 测试报告 | 30 | 30 |
Size Measurement | 计算工作量 | 30 | 30 |
Postmortem & Process Improvement Plan | 事后总结, 并提出过程改进计划 | 60 | 120 |
合计 | 4620 | 8760 |
解题思路
我的主要思路就是对整个每一个宫格进行一个一个的检查,我定义了一个三维数组,前两个是用来存每一个宫格的盘面,第三个是用来存这个格子所能填的数字。对每一个各自进行检查,检查这个格子的行和列还有小宫格有哪些数字已经出现过,将其标记。最后检查哪些格子只有一个数字没有被标记就直接将其填入这个格子。然后重复上面的操作。当格子里没有0的时候就停止,输出。
代码实现
主函数实现
int main(int argc, char* argv[])
{
int i, n, j, k;
int id = 0;
ifstream ifp;
ofstream ofp;
N = atoi(argv[2]);
N = N + 1;
n = atoi(argv[4]); ifp.open(argv[6]); if (!ifp.is_open())//判断文件是否成功打开 cout << "File open failed" << endl; ofp.open(argv[8]); if (!ofp.is_open()) cout << "File open failed" << endl; int count = 0; while (n--) { for (i = 1; i < N; i++) for (j = 1; j < N; j++) ifp >> sudu[i][j][0]; for (i = 1; i < N; i++) for (j = 1; j < N; j++) for (k = 1; k < 10; k++) sudu[i][j][k] = 1; inti(); ofp << endl; int q = 5; while (q--) { for (i = 1; i < N; i++) { for (j = 1; j < N; j++) if (sudu[i][j][0] == 0) inti(); } for (i = 1; i < N; i++) for (j = 1; j < N; j++) if (sudu[i][j][0] == 0) count++; if (count == 0) break; count = 0; } for (i = 1; i < N; i++) for (j = 1; j < N; j++) { if (sudu[i][j][0] == 0) id++; } if (id != 0) solve(id); for (i = 1; i < N; i++) { for (j = 1; j < N; j++) { ofp << sudu[i][j][0] << ' '; } ofp << endl; } } return 0; }
实现代码
1 void intgongge()
2 {
3 int i, j, k;
4 int cnt = 0;
5 for (i = 1; i < N; i++)
6 for (j = 1; j < N; j++) 7 { 8 if (sudu[i][j][0] == 0) 9 { 10 for (k = 1; k < N; k++) 11 { 12 if (sudu[i][k][0] != 0) 13 sudu[i][j][sudu[i][k][0]] = 0; 14 } 15 for (k = 1; k < N; k++) 16 { 17 if (sudu[k][j][0] != 0) 18 sudu[i][j][sudu[k][j][0]] = 0; 19 } 20 if (N == 5 || N == 7 || N == 9 || N == 10) 21 { 22 if (N == 10) 23 ninesudu(i, j); 24 if (N == 9) 25 eightsudu(i, j); 26 if (N == 7) 27 sixsudu(i, j); 28 if (N == 5) 29 foursudu(i, j); 30 } 31 for (k = 1; k < N; k++) 32 { 33 if (sudu[i][j][k] != 0) 34 cnt++; 35 } 36 if (cnt == 1) 37 { 38 for (k = 1; k < 10; k++) 39 { 40 if (sudu[i][j][k] != 0) 41 { 42 sudu[i][j][0] = k; 43 break; 44 } 45 } 46 } 47 } 48 cnt = 0; 49 } 50 }
递归函数
1 void fillnumber(int number, int i, int j) {
2 for (int k = 1; k < N; k++) {
3 sudu[i][k][number]++;
4 sudu[k][j][number]++;
5 }
6 /*for (int n = 0; n < 3; n++) {
7 for (int m = 0; m < 3; m++) {
8 sudu[i / 3 * 3 + n][j / 3 * 3 + m][number]++;
9 }
10 }*/
11 } 12 void resetnumber(int number, int i, int j) { 13 for (int k = 1; k < N; k++) { 14 sudu[i][k][number]--; 15 sudu[k][j][number]--; 16 } 17 /*for (int n = 0; n < 3; n++) { 18 for (int m = 0; m < 3; m++) { 19 sudu[i / 3 * 3 + n][j / 3 * 3 + m][number]--; 20 } 21 }*/ 22 } 23 void solve(int id) 24 { 25 if (id == 0) 26 return; 27 for (int i = 1; i < N; i++) 28 { 29 for (int j = 1; j < N; j++) 30 { 31 if (sudu[i][j][0] == 0) 32 { 33 for (int number = 1; number < 10; number++) 34 { 35 if (sudu[i][j][number] == 0) 36 { 37 fillnumber(number, i, j); 38 sudu[i][j][0] = number; 39 solve(id - 1); 40 sudu[i][j][0] = 0; 41 resetnumber(number, i, j); 42 } 43 } 44 return; 45 } 46 } 47 } 48 }
代码静态检查
性能分析
我在性能分析的时候不知道为什不能进行它的性能分析上次作业也是这样还没搞清楚。
总结
在这次的作业中,感觉自己不足的地方还有好多,本次作业感觉对于我来说有点难,因为自己的能力还不够,做起来有点吃力,老师讲的内容也运用不到实际应用上来,本次主要遇到的问题是参数难导入,自己在进行性能分析优化的时候总是出现问题,还没有完全解决,我的电脑在进行性能优化的时候总是遇到一些错误不知道是我的版本问题还是我的代码问题,但总的来说通过此次作业还是学到了不少的东西,最起码自己迈出了做代码的静态检查,性能优化的尝试,还有单元测试,虽然还有问题没解决没做到,但起码在不断进步。
自我评价
作业名称:2020软件工程作业03 | ||||||||||||||||
作业内容: | ||||||||||||||||
学号 | 姓名 | 作业头 | Github项目地址 | 代码要求经过code Quality analysis工具的分析并消除所有警告 |
PSP表格 | 解题思路描述 | 设计实现过程 | 改进程序性能 | 代码说明 | 结合构建之法谈心路历程和感想 |
总分 | |||||
估计 | 实际 | 代码如何组织 | 关键函数画出流程图 | 单元测试的设计 | 找出瓶颈性能 | 改进 | 展示关键代码 | 解释思路与注释说明 | ||||||||
2分 | 1分 | 2分 | 0.5分 | 0.5分 | 1分 | 0.5分 | 1分 | 0.5分 | 0.5分 | 0.5分 | 0.5分 | 0.5分 | 1分 | 12分 | ||
20177595 | 林金 | 2分 | 1分 | 1分 | 0.5分 | 0.5分 | 1分 | 0.5分 | 0分 | 0分 | 0.5分 | 0.5分 | 0.5分 | 0分 | 0.5分 | 8.5分 |