• 软件工程第二次作业(完整版)


    GitHub地址(之前太粗心,没有看到要生成txt文件这个要求,后来重新上传了一次。)

    项目需求
    利用程序随机构造出 N 个已解答的数独棋盘 。
    输入
    数独棋盘题目个数 N
    输出
    随机生成 N个不重复的已解答完毕的数独棋盘,并输出到 sudoku.txt中

    ——引用自《第二次作业——个人项目实战[http://www.cnblogs.com/vertextao/p/7472376.html]》


    PSP2.1 Personal Software Process Stages 预估耗时(分钟) 实际耗时(分钟)
    Planning 计划 30 30
    · Estimate · 估计这个任务需要多少时间 100 100
    Development 开发 300 300
    · Analysis · 需求分析 (包括学习新技术) 60 30
    · Design Spec · 生成设计文档 60 0
    · Design Review · 设计复审 (和同事审核设计文档) 30 30
    · Coding Standard · 代码规范 (为目前的开发制定合适的规范) 30 0
    · Design · 具体设计 60 60
    · Coding · 具体编码 180 120
    · Code Review · 代码复审 120 120
    · Test · 测试(自我测试,修改代码,提交修改) 60 120
    Reporting 报告 60 60
    · Test Report · 测试报告 60 30
    · Size Measurement · 计算工作量 10 10
    · Postmortem & Process Improvement Plan · 事后总结, 并提出过程改进计划 60 120
    合计 1160 1130

    心路历程:

    1、初看题目,我的第一想法是在每个位子随机生成数字,生成随机的矩阵,然后设置限定条件只输出符合数独的,转念一想这个工作量似乎有点大,会做很无用功。于是我百度了一下,想看看有没有什么生成数独的方法比较省力,可以借鉴一下,然而,网上关于这个几乎都是代码,看来人工解数独也没有什么好方法呀。
    2、于是我自己想了一个方法,就是将数独分为几个部分,不单独分开来比对宫格内是否重复,而是在填入数字的时候放在一起判断。嗯……这个方法,想起来很直白,我觉得可能也许会快一点。于是我开始洋洋洒洒地写了起来,准备先把框架写出来,最后再debug,然而写完后根本就de不过来……这下就尴尬了,以下是当时代码的部分遗体:
    
        int judge1(int i)
        {
    	    for(j=1;j<=9;j++)
    	    {
    	    if(j==1||j==2||j==3)
        	    {
    		        if(a!=shudu[i-1][1]&&a!=shudu[i-1][2]&&a!=shudu[i-1][3])
    	                   return 1;
    	                else
    	                   return 0;
    	      };break;
    	    if(j==4||j==5||j==6)
    	    {
    		        if(a!=shudu[i-1][4]&&a!=shudu[i-1][5]&&a!=shudu[i-1][6])
    	                   return 1;
    	               else
    	                   return 0;};break;
                if(j==7||j==8||j==9)
    	    { 
    		        if(a!=shudu[i-1][7]&&a!=shudu[i-1][8]&&a!=shudu[i-1][9])
    	                   return 1;
    	                else
    			    return 0;};break;
                }
    
        }/*判断生成数与上一层三列是否相同*/ 
    

      3、向上面这么~~能打~~乱七八糟的函数,我写了四个,所以浪费了很多时间,我决定把这个锅甩给写的时间太晚。但是我还是学到了:开始写代码之前,应该先有清晰的思路,不能总是期待最后再来de bug。于是后来我决定推到重来,后来第二次写的想法是,把第一个位子先通过学号生成出来,这是固定的,然后生成与第一个数字不一样的第一行余下各个位子。接着从第二行第一列开始,通过递归,一个一个比对下去,先比对行,再比对列,接着先找到每个宫格的边界格子,再进行遍历宫格的9个位子,共有九个宫格。这是比对的代码:
    
    #include <time.h>
    #include <cstdlib>
    #include <iostream>
    #include <algorithm>
    using namespace std;
    int sudoku[10][10];   
    int N, i, j,u,v;
    int main()
    {
        freopen("sudoku.txt", "w+", stdout);
    	int fn = (1 + 4) % 9 + 1;
        int star(int i, int j);    
    	cin >> N;
    	srand((unsigned)time(NULL));//以当前系统时间生成随机数
    	for (int m = 0; m<N; m++)
    	{
    
    		for (i = 1; i <=9; i++)
    		{
    			for (j = 1; j <=9; j++)
    				sudoku[i][j] = 0;
    		}                                  //初始化数独矩阵
    		for (i = 1; i <= 9; i++)
    		{
    			sudoku[1][i] = i;              //按序生成第一行
    		}
    		sudoku[1][1] = fn;                 
    		sudoku[1][fn] = 1;
    		random_shuffle(&(sudoku[1][2]), &(sudoku[1][9]));  //第一行第一个数交换为6,使后八个数随机排列
    		
    		
    		star(2, 1);           //调用star函数,从第二行第一个数开始生成数独矩阵
    		
    		for (i = 1; i <= 9; i++)
    		{
    			for (j = 1; j <= 9; j++)
    				cout << sudoku[i][j] << " ";
    				cout << endl;;
    		}//输出生成的数独矩阵
    		
    		cout << endl;
    	}
    
    	return 0;
    }
    int star(int i, int j)
    {
    	int same;
    	
    	if (i > 9 || j > 9)
    	{
    		return 1;
    	}
    		
    		
    	for (int a = 1; a <= 9; a++)
    	{
    		same = 1;
    		for (int b = 1; b<i; b++)
    		if (a == sudoku[b][j])
    		{
    				same = 0;
    				break;
    		}//检测上下有无重复
    		
    		if (same)
    		{
    			for (int n = 1; n<j; n++)
    				if (a == sudoku[i][n])
    				{
    					same = 0;
    					break;
    				}//检测左右有无重复
    		}
    		
    		if (same)
    		{
    			int x = (i / 3) * 3 + 3;
    			int y = (j / 3) * 3 + 3; //找到宫格的边界格子
    			if (i % 3 == 0)
    			{
    				x = i;
    			}
    			if (j % 3 == 0)
    			{
    				y = j;
    			}
    			for (u = x - 2; u <= x; u++)  //检查宫格中有无重复
    			{
    				if (same == 0)
    					break;
    				for (v = y - 2; v <= y; v++)
    					if (a == sudoku[u][v])
    					{
    						same = 0;
    						break;
    					}
    			}
    		}
    		
    		if (same)
    		{
    			sudoku[i][j] = a;
    			if (j<9)
    			{
    				if (star(i, j + 1))   //跳到此行的下一列 
    					return 1;
    			}
    			else
    			{
    				if (i < 9)
    				{
    					if (star(i + 1, 1))    //跳到此列下一行
    						return 1;
    				}
    				else
    					return 1;  //当行或列数超过9时结束
    
    			}
    			sudoku[i][j] = 0;   
    		}
    		
    	}
    	return 0; 
    }
    
    

    性能分析:

    总结:
    这周因为补考的事情迟交了,忘了挺多东西的,因为这个代码是之前写好的,印象很深的一点就是不能莽,要好好构思了再开始写代码,不然会做很多无用功,效率极低,然后就是学会了用效能分析工具。

    第几周 新增代码(行) 累计代码(行) 本周学习耗时(小时) 累计学习耗时(小时) 重要成长
    1 500 500 19 19 学会了用效能分析工具
  • 相关阅读:
    软件-集成开发环境:IDE
    框架-Eureka:初识 Eureka
    框架:Rureka
    计算机系统-组件:DS(目录服务)
    院校-美国-麻省理工学院(MIT):百科
    院校-国外-美国-斯坦福大学( Stanford):百科
    院校:目录
    杂项:院校
    网络:万维网(WWW)
    词语辨析
  • 原文地址:https://www.cnblogs.com/losttrain/p/7502564.html
Copyright © 2020-2023  润新知