2019软件工程实践第三次作业
Github地址:https://github.com/LuoAiyue/031702601
(只能用于三宫格的菜鸟代码)
PSP表格
PSP | 预估耗时(小时) | 实际耗时(小时) |
---|---|---|
计划 | 1 | 0.5 |
估计这任务需要多少时间 | 27 | 19 |
开发 | 3 | 2 |
需求分析 | 3 | 1 |
生成设计文档 | 1 | 2 |
设计复审 | 2 | 0.5 |
代码规范 | 1.5 | 0.5 |
具体设计 | 2 | 0.5 |
具体编码 | 6 | 3 |
代码复审 | 3 | 5 |
测试 | 2 | 2 |
报告 | 1 | 1 |
测试报告 | 1 | 0.5 |
计算工作量 | 1 | 0.5 |
事后总结,并提出过程改进计划 | 0.5 | 0.5 |
合计 | 27 | 19 |
因为这次只做了三宫格的,所以实际完成时间比预计少很多
我的解题思路
解三宫格数独
1、找出盘面上已知两个数的两行两列,把这两个交叉点填上
2、遍历所有行,遇见有两格已知点的,就把剩下一格补上,有的行全空的,就跳过
3、遍历所有列,把每一列剩下那格补上
上代码
int a[3][3]; //用来存放表盘的二维数组 int row[2] = { 0 }; //用来存放已知数的行 int line[2] = { 0 }; //用来存放已知数的列 int b[2]; //用来存放已知点 const int c[3] = { 1,2,3 };
这个是输入函数
1 void input() 2 { 3 FILE* fp1; 4 fp1 = fopen("input.txt", "r"); 5 6 for (int i = 0; i < 3; i++) 7 { 8 for (int j = 0; j < 3; j++) 9 { 10 11 fscanf(fp1, "%d", &a[i][j]); 12 if (a[i][j] != 0) //找出已知点,并记录下它们的行和列 13 { 14 row[t] = i; 15 line[t] = j; 16 b[t] = a[i][j]; 17 t++; 18 } 19 } 20 } 21 }
这个是填上交叉点的函数
void search() { int y = 6; for (int i = 0; i < 2; i++) { for (int j = 0; j < 3; j++) { if (b[i] == c[j]) y = y - c[j]; } } for (int i = 0; i < 2; i++) { for (int j = 0; j < 2; j++) { if (a[row[i]][line[j]] == 0) { a[row[i]][line[j]] = y; } } } }
行遍历函数
void hang() { int y = 6; for (int i = 0; i < 3; i++) { int temp = 0; //计数菌 for (int j = 0; j < 3; j++) { if (a[i][j] != 0) temp++; } if (temp == 2) //找出有两个已知数的行 { for (int k = 0; k < 3; k++) //找出剩下那个数 { if (a[i][k] != 0) { y = y - a[i][k]; } } for (int f = 0; f < 3; f++) //将剩下那个数填入空格中 { if (a[i][f] == 0) { a[i][f] = y; } } y = 6; //每一重循环完毕,记得把y归为6 } else continue; } }
列遍历和行遍历相似,所以不放代码了。
我在这里定义了一个临时变量y,用来计算空缺的那个数。因为刚好1+2+3=6,减去已知的数字,结果就是未知的那个。(运气好,刚好遇到这种情况,所以这只能用于三宫格)
之前我的方法是遇到已知数,然后把c数组里面的那个已知数置0,然后一个小循环把非0的那个数找出来,就是未知数。但是问题来了,后面这个c数组就不能变回{1,2,3},就不能继续用了,就算我在第一重循环下面加了个int c[3]={1,2,3};也没用。
后面我又想了一下,不如把c数组当作“工具人”,就用来比较是否相等,再在这函数里定义一个同为{1,2,3}的数组,用来修改为0。但是这个在函数里定义的数组,也是和c数组一样的啊,二重循环一次过后回不到初始状态了,被自己蠢到了。
然后我又想到,既然未知数是0,那么拿来和{1,2,3}比较,已知数肯定能找到相等的,找不到相等的就是未知数咯。愚蠢的我忘记这是个二重循环,假如已知数中有个3,那么它和1比较,肯定不相等啊,就被当作未知数处理了。(再一次被自己蠢到,double kill)
我为什么这么执着于在数组里改数据呢,因为这样就可以应用到5宫这种7宫这种不用考虑宫的环境啦。
可能有人会说,既然你找未知数的方法都一样,那为什么不写个函数然后调用呢?我开始就是这么写的,但是出了点问题,导致传递参数的时候出现语法错误,顺着这错误百度了一下也没找到结果,因为赶时间所以就选择了没调用。只能怪自己曾经基础没打好啊。(所以菜是原罪= =)
代码调试阶段
测试样例
总的来说,虽然代码简单,黑猫白猫,能捉到老鼠就是好猫。这次代码全是自己的思路(因为简单,百度上搜了下都是玩九宫格那些大佬),遇到问题也是自己一点一点悟出来的,没有问同学,对于我来说真的很难得了TAT。这次代码体验深深感受到没打好基础是什么后果。后面的学习要更加努力鞭策自己,严格执行第二次作业的学习计划。(流下了不学无术的眼泪)