软件工程实践2019第三次作业
一、准备
1.Github项目地址:https://github.com/lokking/031702242
2.PSP表格:
PSP2.1 | Personal Software Process Stages | 预估耗时(分钟) | 实际耗时(分钟) |
---|---|---|---|
Planning | 计划 | 60 | 60 |
Estimate | 估计这个任务需要多少时间 | 20 | 10 |
Development | 开发 | 60 | 240 |
Analysis | 需求分析(包括学习新技术) | 240 | 240 |
Design Spec | 生产设计文档 | 60 | 20 |
Design Review | 设计复审 | 60 | 20 |
Coding Standard | 代码规范(为目前的开发制定合适的规范) | 30 | 60 |
Design | 具体设计 | 240 | 180 |
Coding | 具体编码 | 120 | 240 |
Code Review | 代码复审 | 60 | 60 |
Test | 测试(自我测试,修改代码,提交修改) | 240 | 120 |
Reporting | 报告 | 60 | 60 |
Test Repor | 测试报告 | 60 | 60 |
Size Measurement | 计算工作量 | 60 | 60 |
Postmortem & Process Improvement Plan | 事后总结,并提出过程改进计划 | 60 | 60 |
合计 | 1430 | 1490 |
3.解题思路
第一步:解决文件的输入与输出;
第二步:将读取的字符型文件改为整型,建立一个结构体,里面存放的是未填单元的可填数字;
第三步:遍历数组里的每一个数字,找到需要填的空,然后如果是三、五、七宫类型的数独只需要遍历横和竖,把已经出现的数字排斥,如果是其他类型的数独的话,在遍历一下宫,把宫里面已经出现的数字排除。经过遍历以后如果可能数只剩下一个时,填入单元格。
这种方案只能解决只存在唯一解的问题。
主要函数:
Search() 用来排除在横和列中已经出现过的数字
Four()、Six()、Eight()、Nine() 用来排除待填格所对应宫已经出现过的数字
Check() 用来检查是否填完
Search():
int Search(int arr[10][10], int k1, int k2, int n) //把k1,k2对应小格中不可能的数排除
{
int i;
int len = n;
for (i = 1; i <= n; i++)
{
if (arr[k1][i] != 0 && i != k2)
{
r[k1][k2].pbnum[arr[k1][i]] = 0;
}
}
for (i = 1; i <= n; i++)
{
if (arr[i][k2] != 0 && i != k1)
{
r[k1][k2].pbnum[arr[i][k2]] = 0;
}
}
for (i = 1; i <= n; i++)
{
if (r[k1][k2].pbnum[i] == 0)
len--;
}
if (len != 1)
return 0;
else
{
for (i = 1; i <= n; i++)
{
if (r[k1][k2].pbnum[i] == 1)
break;
}
return i;
}
}
Four():
int Four(int arr[10][10],int k1,int k2)
{
int i, j, x;
int len = 4;
if (k1 <= 2 && k2 <= 2)
{
for (i = 1; i <= 2; i++)
{
for (j = 1; j <= 2; j++)
{
if (arr[i][j] != 0)
{
r[k1][k2].pbnum[arr[i][j]] = 0;
}
}
}
}
else if (k1 <= 2 && k2 >= 3)
{
for (i = 1; i <= 2; i++)
{
for (j = 3; j <= 4; j++)
{
if (arr[i][j] != 0)
{
r[k1][k2].pbnum[arr[i][j]] = 0;
}
}
}
}
else if (k1 >= 3 && k2 <= 2)
{
for (i = 3; i <= 4; i++)
{
for (j = 1; j <= 2; j++)
{
if (arr[i][j] != 0)
{
r[k1][k2].pbnum[arr[i][j]] = 0;
}
}
}
}
else
{
for (i = 3; i <= 4; i++)
{
for (j = 3; j <= 4; j++)
{
if (arr[i][j] != 0)
{
r[k1][k2].pbnum[arr[i][j]] = 0;
}
}
}
}
for (i = 1; i <= 4; i++)
{
if (r[k1][k2].pbnum[i] == 0)
len--;
else
x = i;
}
if (len == 1)
return x;
else
return 0;
}
其他几个函数类似于Four()。
4.测试
3宫格:
4宫格:
5宫格:
6宫格:
7宫格:
8宫格:
9宫格:
5.代码分析
6.性能分析
7.总结
这次作业的体会就是,不懂的还是太多很多都要从零开始,比如说怎么用github,怎么用git等等,所以还需要继续努力。