• 软件工程 第二次作业(改)


    GitHub:Sudoku

    题目地址

    这次的作业大意就是写个数独库生成器(对于输入的n1~1000000,生成相对应数量的不同数独)

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

    1.做出正确的数独图(左上角的数字为(1+6)%9+1=8)(如何生成,思路)
    思路:回溯(dfs),直观的感觉就像一棵树一样延伸下去

    第一个空格直接生成不用判断(题目要求)
    然后往下一格一格生成,需要判断是否满足行,列,3*3矩阵

    2.输出n个数独图其中不能够重复(如何判断重复)
    这个回溯的做法就直接排除了

    3.输出文件到指定目录

    4.由于要用命令行检测,这里的主函数中要改成支持命令行的形式

    5.上传到GitHub
    这里有先关教程的链接:传送门

     实现过程:
    

    类:一个9*9数独类
    其中需要的函数:
    主函数,输出函数,dfs函数,判断1~9其中的数字哪些可以被填入(判断函数)

     主要的代码:
    
    bool panduan(int x,int y,int num){
    	for(int i=0;i<9;i++){         //判断行,列 
    		if(sudoku[x][i]==num){
    			return false;
    		}
    		if(sudoku[i][y]==num){
    			return false;
    		}
    	}
    	
    	for(int i=x/3*3;i<x/3*3+3;i++){      //判断3*3的宫格 
    		for(int j=y/3*3;j<y/3*3+3;j++){
    			if(sudoku[i][j]==num){
    				return false;
    			}
    		}
    	}
    	return true;
    }
    
    bool dfs(int x,int y){
    	if(y==9){
    		x++,y=0;
    	}
    	
    	if(x>8){
    		print();
    		n--;
    		if(n==0){
    			exit(-1);
    		}
    	}
    	
    	for(int i=1;i<=9;i++){
    		if(panduan(x,y,i)){          
    			sudoku[x][y]=i;
    			if(dfs(x,y+1)){	
    			    return true;
    			}else{                                              //回溯 
    				sudoku[x][y]=0;
    			    
    			}
    		}
    	} 
    	return false;
    }
    
    
     测试运行:
    

     性能分析:
    

    选了10000个数据进行测试:

    主要在dfs函数上面消耗的时间最长

     改进的思路:
    

    还没想到实质性的改进思路,等成绩出了,拜读几篇大佬的博客后再做改进。

     反思:
    

    问题想的太简单,具体做的时候错误百出,导致没能按时提交,当做一个警告了。

  • 相关阅读:
    MEF(Managed Extensibility Framework ) 可控扩展框架
    如何打开ASP.NET Configuration页面
    [转贴]技术的乐趣
    ORM工具介绍 NHibernate, EntitySpaces, and LLBLGen Pro 功能分析
    Linq to SQL 学习路线图
    [转贴]What is AntiPattern 什么是反模式
    Master Data Management(MDM)主数据管理
    Introducing Unity Application Block
    C#2.0 C#3.0 语言特性
    javascript声明数组三种方式
  • 原文地址:https://www.cnblogs.com/zxlmhh/p/7502773.html
Copyright © 2020-2023  润新知