这个作业属于那个课程 | https://edu.cnblogs.com/campus/zswxy/software-engineering-2017-1 |
这个作业的要求 | https://edu.cnblogs.com/campus/zswxy/software-engineering-2017-1/homework/10494 |
这个作业的目标 | 完成数独 |
作业正文 | 如下 |
其他参考文献 | 百度 |
1.github 项目地址:
https://github.com/pck0916/TEXT/blob/master/%E4%BD%9C%E4%B8%9A3.txt
2.PSP表格
PSP2.1 | Personal Software Process Stages | 预估耗时(分钟) | 实际耗时(分钟) |
---|---|---|---|
Planning | 计划 | 10 | 10 |
Estimate | 估计这个任务需要多少时间 | 10 | 10 |
Development | 开发 | 15 | 10 |
Analysis | 需求分析 (包括学习新技术) | 20 | 15 |
Design Spec | 生成设计文档 | 25 | 20 |
Design Review | 设计复审 | 25 | 20 |
Coding Standard | 代码规范 (为目前的开发制定合适的规范) | 30 | 35 |
Design | 具体设计 | 25 | 20 |
Coding | 具体编码 | 30 | 15 |
Code Review | 代码复审 | 15 | 10 |
Test | 测试(自我测试,修改代码,提交修改) | 20 | 20 |
Reporting | 报告 | 15 | 15 |
Test Repor | 测试报告 | 10 | 10 |
Size Measurement | 计算工作量 | 10 | 10 |
Postmortem & Process Improvement Plan | 事后总结, 并提出过程改进计划 | 30 | 35 |
合计 | 290 | 255 |
3.解题思路描述.
刚开始看到这个题目的时候.就感觉很难,产生了畏难心理,然后就去百度,问同学。过了好一阵子才慢慢找到头绪,自己对编程学习学得太差,所以遇到难题就显得毫无办法。
经过找资料,查百度,才用了回溯法解决这个问题。
4.具体代码:
#include <stdio.h>
int a[9][9];
int place(int x, int y) //二者分别是数组对应的行地址和列地址,取值为0-8
{
int up, down, left, right;
int i,j;
up=x/3*3;
down=up+3;
left=y/3*3;
right=left+3;
//以下分三种情况判断是否在x,y对应的位置放这个数,如果不可以放,返回0,如果可以放,返回1,会进一步迭代
for(i=0;i<9;i++){
if(a[x][y]==a[i][y] && i!=x && a[i][y]!=0)
return 0;
}
for(i=0;i<9;i++){
if (a[x][y]==a[x][i] && i!=y && a[x][i]!=0)
return 0;
}
for(i=up;i<down;i++)
{
for(j=left;j<right;j++)
if(i!=x || j!=y)
{
if(a[i][j]==a[x][y] && a[i][j]!=0)
return 0;
}
}
return 1;
}
void backtrack(int t)
{
int i,j;
int x,y;
if(t==81)
{
printf("
=============================
");
for(i=0;i<9;i++)
{
for(j=0;j<9;j++)
printf("%d",a[i][j]);
putchar('
');
}
}
else
{
x=t/9;
y=t%9; //将这个转换为相应的数组行坐标和列坐标
if(a[x][y]!=0)
{
backtrack(t+1);
}
else
{
for(i=1;i<10;i++)
{
a[x][y]=i;
if(place(x,y)==1)
backtrack(t+1);
a[x][y]=0;
}
}
}
}
int main()
{
char str[9][9];
int i,j;
for(i=0;i<9;i++)
gets(str[i]);
for(i=0;i<9;i++)
for(j=0;j<9;j++)
a[i][j]=str[i][j]-'0';
backtrack(0);
return 0;
}
递归回溯方法说明:
第一步:遍历预处理过的矩阵的每一个元素,通过对行,列以及周围格子的检查,得出该位置所有可能的侯选数值。
第二步:通过一个check函数去检查更新过的数独的结果,有三种情况。
1.数独已经被全部填完并正确。
2.数独还有空未填。
3.该数独不满足规则。
第三步:根据上述check的情况,分别对应三种情况:
1.先把此次答案打印出来,然后返回上一次递归继续解题,查看是否有多解。
2.选取未填的格子里面侯选数最少的一个格子选填一个侯选值,执行第二步。
3.退出当前的尝试,返回上一次递归并换下一个可能的侯选值。
5.心路历程与收获:
这次作业虽然是马虎的完成了,但是还有很多地方没有涉及到,原因很简单,就是自己学得不好,在以后的学习中再慢慢的去学习和改进吧。经过这次的作业,发现了自己和别人差距还是很大的,有的人做得很完美,而我却做得不好。所以在以后的学习中还是得努力查漏补缺。
6.评分表
学号 | 姓名 | 作业头 | Github项目地址 | 代码静态检查 | PSP表格 | 解题思路描述 | 设计实现过程 | 代码说明 | 心路历程感想 | 总分 |
20177675 | 彭倡科 | 2 | 1 | 0 | 1 | 0.5 | 1 | 0.5 | 1 | 7 |