• sudoku作业


    1.Github项目地址:

    https://github.com/ataiyang/ls

    2.PSP表格

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

    3.解题思路

    刚刚拿到题目时一脸懵逼,后来上网查了相关资料了后,发现了一种随机的方式,网上那个是解数独的方法,我将它改装了一下,大致思路是这样的:按顺序一个个随机,当每个随机时去判断每行每列及所在宫里是否有相同的数,如果有,该位置重新随机,并记录次数,当重新随机次数超过50时,从头开始随机,如果没有,随机下一个位置的数,如果填满了九宫格,则算一次成功,输出。(为什么是50,因为刚开始时是10,时间太长了2.5分钟,改成20,时间20几秒,改成30,时间18秒,40时间15秒,50时间13~14秒)。

    遇到的困难及学习的新知识

    时间上有点久后来记录错误的参数变大,就解决了。
    命令行传参原本不会,百度去了解后会了。
    输出到文件也是原本不会,后也去百度了解解决了。

    4.设计实现

    没有类,2个函数,一个函数用来完成填一个九宫格的过程,一个函数用来实现判断是否符合数独的规律,后来将第一个函数移到主函数中了。

    5.代码说明

    这是判断的主要代码:

    	for (m = 0, n = j; m < 9; m++) {//判断行里是否有重复的数
    	if (a[m][n] == a[i][j] && m != i) {
    		return 0;
    	}
    }
    for (m = i, n = 0; n < 9; n++) {//判断列里是否有重复的数
    	if (a[m][n] == a[i][j] && n != j) {
    		return 0;
    	}
    }
    p = i / 3;
    q = j / 3;
    for (m = p * 3, n = q * 3; m < (p + 1) * 3;) {//判断本宫里是否有重复的数
    	if (a[m][n] == a[i][j] && m != i&&n != j) {
    		return 0;
    	}
    	else {
    		if (n < (q * 3 + 2)) {
    			n++;
    		}
    		else {
    			n = q * 3;
    			m++;
    		}
    	}
    } 
    

    这是填空的主要代码:

    	for (l = 0; l < n; l++) {
    	int a[9][9] = { 0 };//九宫格初始化
    	int i, j, m, n, x, k = 0;
    	for (i = 0, j = 0; i != 9;) {
    		if (i == 0 && j == 0) {//学号后2位为23,所以是6
    			a[i][j] = 6;
    			k = 1;
    		}
    		if (k == 0) {
    			a[i][j] = rand() % 9 + 1;//填当前格
    		}
    		if (judge(a, i, j)) {
    			if (j < 8) {
    				j++;
    				k = 0;
    			}
    			else {
    				i++;
    				j = 0;
    				k = 0;
    			}
    		}
    		else if (k<50) {//k用来记录当前格错误次数,当超过50个时,从头开始
    			k++;
    			a[i][j] = rand() % 9 + 1;
    		}
    		else if (k == 50) {
    			k = 0;
    			for (i = 0, j = 0; i < 9;) {//重新初始化
    				a[i][j] = 0;
    				if (j < 8) { j++; }
    				else {
    					j = 0;
    					i++;
    				}
    			}
    			i = 0;
    			j = 0;
    		}
    	}
    

    6.测试运行

    这是运行结果的部分截图:

    7.性能分析

    这是性能分析的截图:

    8.学习进度条

    第N周 新增代码(行) 累计代码(行) 本周学习耗时(小时) 累计学习耗时(小时) 重要成长
    1 120 120 24 24 学会很多小技巧,命令行传参,输出到文件之类

    9.执行力 、 泛泛而谈 的理解

    我认为,执行力就是实际去做事情,将想法付诸行动实现的能力,而泛泛而谈就是说个大概,列举出很多在做之前的想法为了将来做事情做准备,两者都是有用的,大概就是这样了。

  • 相关阅读:
    使用JMeter进行RESTful API测试
    Jmeter中Websocket协议支持包的使用
    JMeterPlugins插件监听器学习-监听器
    Jmeter实现WebSocket协议的接口和性能测试方法
    使用JMeter创建数据库(Mysql)测试
    jmeter --JVM调优设置
    Android 开发者不得不面对的六个问题
    年底盘点之十大开源安全工具
    作为一个程序员怎么通过android开发赚钱
    新手做2D手游该用哪些工具?
  • 原文地址:https://www.cnblogs.com/ataiyang/p/7500490.html
Copyright © 2020-2023  润新知