Github地址:https://github.com/LuoAiyue/031702601 git
(只能用于三宫格的菜鸟代码)github
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 |
由于此次只作了三宫格的,因此实际完成时间比预计少不少函数
个人解题思路工具
解三宫格数独学习
一、找出盘面上已知两个数的两行两列,把这两个交叉点填上测试
二、遍历全部行,碰见有两格已知点的,就把剩下一格补上,有的行全空的,就跳过编码
三、遍历全部列,把每一列剩下那格补上spa
上代码设计
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。此次代码体验深深感觉到没打好基础是什么后果。后面的学习要更加努力鞭策本身,严格执行第二次做业的学习计划。(流下了不学无术的眼泪)