2020软件工程作业03

断了今生、忘了曾经 提交于 2020-04-12 15:28:55
软件工程第三次作业
这个作业属于那个课程 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("\n=============================\n");
for(i=0;i<9;i++)
{
for(j=0;j<9;j++)
printf("%d",a[i][j]);
 
putchar('\n');
}
}
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

 

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!