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

 

posted @ 2019-09-25 18:44  一粒心火  阅读(230)  评论(2编辑  收藏  举报