软件工程实践第二次作业——个人项目

- 作业传送门

一、Github项目地址

- GitHub传送门

二、在开始实现程序之前,我估计将在程序的各个模块的开发上耗费的时间。

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

三、解题思路,心路历程

看到题目的时候感觉很乱,发现和皇后问题有点像,都是有制约条件,于是我就想先把制约的东西写出来。也就是每行不重复,每列不重复,每宫不重复。其实制约的算法不难,只是实现有困难。
看了一些关于数独和皇后问题的博客,发现,网上很多是采用随机函数然后一格一格填,填不下去再回溯,但是这种填数的方式可能会遇到会后退非常多步的情况。因为做题的时间比较少,受到了同学的提示,于是我就尝试了一种按数字填格子的方法。可能是因为受了提示,所以我觉得实现起来和按格子填数没什么差别,而且思路更加清晰了。就决定是它了!
具体的操作就是在棋盘里先把所有合适n的位置填上n,然后再填下一个数。实现的过程中遇到了一些问题,比如不知道如何实现结束程序和如何返回上一级继续搜索……

四、设计实现过程

整个项目有一个类,三个函数。关系情况如下
1238689-20170916215550438-1658442617.png
Init()函数用于初始化,Print()函数用于打印出数独解,Dfs()函数用于求解过程,求解过程不断回溯调用。
其实还可以再细分成输入一个类,输出一个类,增加判断函数等……有很多待改进的地方。

五、关键代码

思路上面已经提过了,就是按数字填格子的方法,比如先把全1填好,再填全2……
想好了思路,就是实现的问题了。
三种制约条件,打算利用行数的制约为基本,填好一行就换下一行,其他两种为判定条件。结束所有行的填数就换下一个数字。

    if(num == 9) print();
    //判断数字是否要更新,只需要判断现在行数是否到8,row表示行数
    if (row == 8) Dfs(num + 1, 0);
    else  Dfs(num, row + 1);
    //判断该位置是否可以填写
    //其中row表示行数,j表示列数,vis数组代表该位置是否填过,col数组表示该列是否填过,pal 表示该宫是否填过
    //宫号为npal,计算方式为row / 3 * 3 + j / 3
    if ( vis[row][j] || col[num][j] || pal[num][npal] )  continue;
    else  vis[row][j] = 1, col[num][j] = 1, pal[num][npal] = 1, map[row][j] = num;
    //输出的结果已经满足时,结束程序
    if(cnt == need)  exit(0);

六、测试运行

1238689-20170916221623360-160950445.png
1238689-20170916221632750-1648943375.png
没有用随机数,第一位固定是 1,随机方式不知道如何排重,待改进。

七、改进思路,性能分析

  • 当n=1000时
    1238689-20170916223411547-63579012.png
  • n=1000000时
    1238689-20170916223900875-1885432721.png
    1238689-20170916224227016-637404396.png
    通过性能分析可以知道,事实上输出浪费了很多的时间,改进的方向应该是改变输出方式。但是我现在的输出方式已经是用printf的方式输出了,用cout可能会更炸。
    输出方式待改进。

八、实现完程序之后,我在程序的各个模块上实际花费的时间。

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

转载于:https://www.cnblogs.com/amuswan/p/7531990.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值