2020软件工程作业03
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 |
作业正文 | 本文 |
参考文献 | 百度,CSDN |
GitHub地址:https://github.com/yaoDMS/123456/tree/master/sudoku
PSP表格
PSP2.1 | Personal Software Process Stages | 预估耗时(分钟) | 实际耗时(分钟) |
---|---|---|---|
Planning | 计划 | 30 | 30 |
Estimate | 估计这个任务需要多少时间 | 1200 | 1800 |
Development | 开发 | 240 | 300 |
Analysis | 需求分析(包括学习新技术) | 60 | 130 |
Design Spec | 生成设计文档 | 30 | 30 |
Design Review | 设计复审 | 20 | 15 |
Coding Standard | 代码规范(为目前开发制定合适的规范) | 20 | 30 |
Design | 具体设计 | 20 | 30 |
Coding | 具体代码 | 60 | 420 |
Code Review | 代码复审 | 20 | 100 |
Test | 测试(自我测试,修改代码,提交修改) | 60 | 180 |
Reporting | 报告 | 30 | 20 |
Test Repor | 测试报告 | 30 | 20 |
Size Measurement | 计算工作量 | 10 | 15 |
Postmortem & Process Improvement Plan | 事后总结 | 30 | 20 |
合计 | 1860 | 3140 |
解题思路
利用九宫格行列不能重复的性质,在二维数组中实现。
实现过程
流程图
由于3,5,7这三阶数独没有宫,因此可以看成同一类;而4,6,8,9这四阶数独有不同的宫,因此分开来写。把需要求的空余部分用0来代替。
public static void DFS(char[][] arr, int x, int y) {
if(x == m){
print(arr);
System.exit(0);
}
if(arr[x][y] == '0'){
for(int i = 1; i < m+1; i++){
if(check(arr, x, y, i)){
arr[x][y] = (char)('0' + i);
DFS(arr, x + (y + 1) / m, (y + 1) % m);
}
}
arr[x][y] = '0';
}else{
DFS(arr, x + (y + 1) / m, (y + 1) % m);
}
}
public static boolean check(char[][] arr, int x, int y, int k){
if(m==3||m==5||m==7) {
for(int i = 0; i < m; i++){
if
(arr[x][i] == (char)('0' + k) || arr[i][y] == (char)('0' + k))
{
return false;
}
}
}
case 4:
for(int i = 0; i < m; i++){
if (arr[x][i] == (char)('0' + k) || arr[i][y] == (char)('0' + k)) {
return false;
}
}
for(int i = (x / 2) * 2; i < (x / 2 + 1) * 2; i++){
for(int j = (y / 2) * 2; j < (y / 2 + 1) * 2; j++){
if(arr[i][j] == (char)('0' + k)){
return false;
}
}
}
break;
case 6:
for(int i = 0; i < m; i++){
if (arr[x][i] == (char)('0' + k) || arr[i][y] == (char)('0' + k)) {
return false;
}
}
for(int i = (x / 2) * 2; i < (x / 2 + 1) * 2; i++){
for(int j = (y / 3) * 3; j < (y / 3 + 1) * 3; j++){
if(arr[i][j] == (char)('0' + k)){
return false;
}
}
}
break;
case 8:
for(int i = 0; i < m; i++){
if (arr[x][i] == (char)('0' + k) || arr[i][y] == (char)('0' + k)) {
return false;
}
}
for(int i = (x / 4) * 4; i < (x / 4 + 1) * 4; i++){
for(int j = (y / 2) * 2; j < (y / 2 + 1) * 2; j++){
if(arr[i][j] == (char)('0' + k)){
return false;
}
}
}
break;
case 9:
for(int i = 0; i < m; i++){
if (arr[x][i] == (char)('0' + k) || arr[i][y] == (char)('0' + k)) {
return false;
}
}
for(int i = (x / 3) * 3; i < (x / 3 + 1) * 3; i++){
for(int j = (y / 3) * 3; j < (y / 3 + 1) * 3; j++){
if(arr[i][j] == (char)('0' + k)){
return false;
}
}
}
break;
运行结果
静态检测
没什么大问题
性能分析
总结
看到这个作业,我是真的不想写,总觉得它很麻烦,于是我在题目发布好几天后都没看。直到班级里有人交了之后才仔细看,仔细想。本来基础就不好,更不想做。但环境配置好了之后,发现也不怎么麻烦,还是有收获的。