作业二

github link.

  • 对题目的思考
    题目要求生成若干个已解的数独棋盘。首先想到的是遍历棋盘,找出符合数独规则的情况并。按照这种思路,从棋盘第二个空格开始,用数字1-9填充,分别判断九个数字是否满足规则(与横竖线上,九宫内的数字不重复),若满足便填入该空格并用1-9继续填充下一格,81格全部填完时输出该棋盘。可以等价为一棵除叶节点外每个节点有8个子节点的树,棋盘的每一个解都存在于一条根到叶的路径上,上述便是对该路径的遍历。
  • 设计实现
    依据前面的思考,构造三个主要函数:
    • nextSpace():跳转到下一格,调用fillSpace();
    • fillSpace():调用judgement(),若满足条件便赋值给该格接着调用nextSpace();
    • judgement():判断某各中某数字是否满足条件;
      即递归调用上述函数实现对棋盘的遍历。
  • 代码说明
void fillSpace(int r, int c)
{
	for (int s = 1; s < 10; s++)//分别填入数字1-9
	{
		if (judgement(r, c, s))//判断是否满足条件
		{
			board[r][c] = s;//给该位置赋值
			nextSpace(r, c);//准备填下一个位置
			board[r][c] = 0;//初始化该位置

		}
	}
}
void nextSpace(int r, int c)
{
	c++;
	r += c / 9;
	r = r % 9;
	c = c % 9;//跳转到下一位置
	fillSpace(r, c);
}
  • 运行结果
    部分运行结果。

    结果明显的展示了这种遍历方法的结果非随机的特点。
  • 性能分析
    在下图性能分析的摘要信息中可以发现nextSpace这个函数运行时间很多。


    从下图调用关系树,可以发现这种算法的弊端,大规模的递归调用很占用资源并且速度很慢。
  • 总结
    可以看出这种利用递归遍历的方法虽然实现起来比较简单,但是效率很低。对程序的优化可以考虑利用非递归的方法实现遍利,以消除递归的弊端,目前正在思考中。
    完成的任务的过程中,开始时总觉得时间很充裕,一直将任务延后,直到最后才发现时间真得很紧张,带来得后果便是完成质量的下降。我认为其原因便是没有自己的时间规划,不知不觉中时间就浪费了,觉得应该给自己规划一下。

PSP表格

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

posted on 2017-09-10 22:48  海甸岛  阅读(136)  评论(2编辑  收藏  举报

导航