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

  • 相关阅读:
    日志记录
    python进程基础
    堆和栈的区别
    Mysql数据类型(一)
    JS超链接动态显示图片
    WPF Button控件模板
    js table鼠标点击时变色
    JS表格各行变色
    js动态创建表格
    Codeforces 659G Fence Divercity dp
  • 原文地址:https://www.cnblogs.com/Leslie529-031702601/p/11586668.html
Copyright © 2011-2022 走看看