软件工程实践2017第二次作业
1)Github地址
https://github.com/Maple27/sudoku
2)解题思路
- 个人从小就对数独就很喜欢,对解数独有一定程度的了解,这次自己开发一个构造数独棋盘的程序,我觉的十分有趣并充满挑战。对于开发的思路,我首先想到的是用回溯法,参考了一些网上资料,又看了看题目需求需要生成N个不重复的已解数独棋盘,想到了使用随机数来控制随机棋盘的生成,虽然在特定条件下棋盘会出现重复,但由于我通过当前时间来控制随机数的产生,所以产生重复数独的几率是很小的(暂未想到更好的解决方案)。
3)设计实现
- 本程序由于没有太复杂的调用和功能,所以采用C语言完成,没有使用到面向对象思想。本程序共有4个函数(主函数,回溯法构造数独棋盘函数,检查数字合法性函数,输出函数),其中主函数调用回溯法构造函数,构造函数里再调用检查函数和输出函数实现整体功能。
4)代码说明
-
检查数字合法性
//横向检查 for (p = 0; p < 9; p++) if (p != i && sudoku[p][j] == t) return 0; //纵向检查 for (p = 0; p < 9; p++) if (p != j && sudoku[i][p] == t) return 0; //九宫格内检查 p = i / 3; q = j / 3; for (m = p * 3; m < p * 3 + 3; m++) for (n = q * 3; n < q * 3 + 3; n++) if (m != i && n != j && sudoku[m][n] == t) return 0;
-
回溯法
while (1){ int i = k / 9; int j = k % 9; while (1){ sudoku[i][j]++; if (sudoku[i][j] == 10){ sudoku[i][j] = 0; k--; break; } else if (check(sudoku, i, j) == 1){ k++; break; } } }
5)测试运行
6)改进
- 在改进程序性能方面上大概话费了2个小时,我的改进主要是针对如何进行错误输入的判断和暴力回溯法对CPU和内存的影响,其中还存在一些没有解决的问题。
- 性能分析图:
7)PSP表格
PSP2.1 | Personal Software Process Stages | 预估耗时(分钟) | 实际耗时(分钟) |
---|---|---|---|
Planning | 计划 | 20 | 10 |
· Estimate | · 估计这个任务需要多少时间 | 20 | 10 |
Development | 开发 | 375 | 465 |
· Analysis | · 需求分析 (包括学习新技术) | 30 | 30 |
· Design Spec | · 生成设计文档 | 10 | 10 |
· Design Review | · 设计复审 (和同事审核设计文档) | 5 | 5 |
· Coding Standard | · 代码规范 (为目前的开发制定合适的规范) | 0 | 0 |
· Design | · 具体设计 | 60 | 80 |
· Coding | · 具体编码 | 180 | 210 |
· Code Review | · 代码复审 | 30 | 40 |
· Test | · 测试(自我测试,修改代码,提交修改) | 60 | 90 |
Reporting | 报告 | 90 | 90 |
· Test Report | · 测试报告 | 30 | 30 |
· Size Measurement | · 计算工作量 | 30 | 30 |
· Postmortem & Process Improvement Plan | · 事后总结, 并提出过程改进计划 | 30 | 30 |
合计 | 485 | 565 |