2019软件工程实践第三次做业

 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。此次代码体验深深感觉到没打好基础是什么后果。后面的学习要更加努力鞭策本身,严格执行第二次做业的学习计划。(流下了不学无术的眼泪)

相关文章
相关标签/搜索