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


    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函数上面消耗的时间最长

     改进的思路:
    

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

     反思:
    

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

  • 相关阅读:
    服务器状态码
    QuerySet中添加Extra进行SQL查询
    django配置一个网站建设
    MySQL数据库查询中的特殊命令
    125. Valid Palindrome
    121. Best Time to Buy and Sell Stock
    117. Populating Next Right Pointers in Each Node II
    98. Validate Binary Search Tree
    91. Decode Ways
    90. Subsets II
  • 原文地址:https://www.cnblogs.com/zxlmhh/p/7502773.html
Copyright © 2020-2023  润新知