高级软件工程第二次作业
1.Github地址 xinz
2.解题思路:
一开始拿到这道题的时候,对数独的概念不是那么清晰。通过题目中百度百科的概念,即被概括成满足以下三个条件的数字范围为1-9的棋盘:(1)每一行不能有重复的数字(2)每一列不能有重复的数字(3)9乘9的大数独盘被划分成9个3乘3的小九宫格,在每个小九宫格内不能有重复数字按照人脑填数独的思维我们很容易想到“枚举”的方法,即从填第2个数开始递归填写观察是否满足三个条件,依次往下填写输出一个结果棋盘后进行“回溯”。所以这种“暴力的”程序还是比较简单易懂的,通过百度也了解到其他算法,比如交换行列、用随机数生成等等,但都不如枚举来的直接易懂。•从第二个格子开始,根据数独需要满足的三个条件从1-9枚举填数字,并同时标记该格子内哪些数字试过了•对剩下的格子进行递归操作•输出一个结果棋盘后将记录该数字是否存在的数组复原,为下一次试数做准备,进行回溯,重复上述操作•直到满足所需棋盘个数,结束途径:百度 + 自己思考 + 同学帮忙
3.设计实现过程
3.1流程图:
3.2设计思路:
对输入的格式进行处理,使其输入格式为“sudoku.exe -c 生成数独个数”,封装在input_check函数中输出在outfile函数中,当输出所需个数的数独棋盘后结束枚举试数字的方法(回溯)在sudoku函数中
4.代码说明
int input_check(int argc, char *argv[])
{if (argc != 3){cout << "invaild input" << endl;return -1;}if (argc == 3 && strcmp(argv[1], "-c") != 0){cout << "please input -c" << endl;return -1;//如果输入第二个参数不是-c 不输出}if (atoi(argv[2]) == 0){cout << "please enter a value greater than 0" << endl;return -1;//如果输入第三个参数不是数字 不输出}return atoi(argv[2]);
}
//用递归生成数独,nrow表示当前行,ncol表示当前列,表示当前正在处理第nrow行第ncol列的格子。
void shudu(int nrow, int ncol, ofstream &savefile)
{//计算该格子在哪个九宫格中int nowbox = ((nrow - 1) / 3) * 3 + ((ncol - 1) / 3 + 1);//对该格子进行1-9的数字尝试,如果nownum==num则说明棋盘已经够了,就不用再进行下去了,循环退出for (int i = 1; i <= 9 && nownum<num; i++){//如果数值i在该行该列没有出现过,则进行下一步操作if (row[nrow][ran_num[i]] == 0 && column[ncol][ran_num[i]] == 0 && box[nowbox][ran_num[i]] == 0)//判定数值i在该行该列该九宫格有没有出现过{result[nrow][ncol] = ran_num[i];//把数值i填写入最终棋盘row[nrow][ran_num[i]] = column[ncol][ran_num[i]] = box[nowbox][ran_num[i]] = 1;//记录下i这个值在该行该列和该九宫格出现了//如果这个格子是最后一个格子了,说明已经找到一个数独棋盘if (nrow == 9 && ncol == 9){nownum++;//已找到的数独棋盘数量+1if (nownum == num) outfile(savefile, true);//这个是最后一个棋盘else outfile(savefile, false);//这不是最后的棋盘}//如果这个格子不是最后一个格子,则对下一个格子进行枚举else{if (ncol == 9) shudu(nrow + 1, 1, savefile);//如果这个格子是该行最后一个格子,则换行else shudu(nrow, ncol + 1, savefile);//如果这个格子不是该行最后一个格子,则处理该行下一个格子}row[nrow][ran_num[i]] = column[ncol][ran_num[i]] = box[nowbox][ran_num[i]] = 0;//递归完后复原,为下一个数字的尝试做准备}}
}
//把当前的数独棋盘输出到文件,savefile为输出文件流,islast表示当前输出的棋盘是否为最后一个棋盘
void outfile(ofstream &savefile, bool islast)
{string temp = "";//用来临时保存需要输出的文字for (int i = 1; i <= 9; i++){for (int j = 1; j <= 9; j++){if (j != 1) temp += " ";//每个数字之间需要一个空格temp += result[i][j] + '0';//把每个数字转换成字符}temp += "\r\n";//输出完一行需要换行}if (!islast) temp += "\r\n";//如果这个不是最后一个棋盘,棋盘间需要再次换行。savefile << temp;//把文字输入到文件中
}
5.测试运行
6.效能分析
n=1000时
7.PSP
PSP2.1 | Personal Software Process Stages | 预估耗时(分钟) | 实际耗时(分钟) |
---|---|---|---|
Planning | 计划 | 40 | 45 |
· Estimate | · 估计这个任务需要多少时间 | 600 | 900 |
Development | 开发 | 480 | 780 |
· Analysis | · 需求分析 (包括学习新技术) | 60 | 90 |
· Design Spec | · 生成设计文档 | 20 | 35 |
· Design Review | · 设计复审 (和同事审核设计文档) | 20 | 0 |
· Coding Standard | · 代码规范 (为目前的开发制定合适的规范) | 10 | 5 |
· Design | · 具体设计 | 20 | 25 |
· Coding | · 具体编码 | 300 | 360 |
· Code Review | · 代码复审 | 30 | 15 |
· Test | · 测试(自我测试,修改代码,提交修改) | 60 | 100 |
Reporting | 报告 | 60 | 70 |
· Test Report | · 测试报告 | 60 | 50 |
· Size Measurement | · 计算工作量 | 10 | 0 |
· Postmortem & Process Improvement Plan | · 事后总结, 并提出过程改进计划 | 10 | 15 |
合计 | 1780 | 2490 |
8.心得体会
这是第一次尝试使用Github工具,以及在markdown的排版上也花了一定时间。从拿到题目百度到后期自己思考、请教同学,也花了很多时间。希望以后的项目自己可以越做越顺利!
转载于:https://www.cnblogs.com/linlkg/p/7642003.html
高级软件工程第二次作业相关推荐
- 软件工程 第二周作业
##软件工程第二周作业 提出问题 1. 一般来说,想要自己的程序跑得又快又好,就要减少函数的反复调用,但有所得则必有所失,效能提高就有可能伴随着程序的稳定性的降低,这两者应该如何权衡呢? 2. 关于5 ...
- 软件工程第二次作业——模仿网站
我以我的JS发誓 我以我的解释器宣告 将世界上所有的HTML汇聚 将世界上应有之css样式改变 集中所有的解释器和JS 将这网页为我所用 the Teleport Ultra 倾听我内心的愿望 让它实 ...
- 北航2022软件工程第二次作业——产品评测、分析与规划
软件工程第二次分析作业 项目 内容 这个作业属于哪个课程 北京航空航天大学2022春季软件工程(罗杰 任健) 这个作业的要求在哪里 个人阅读作业-软件案例分析 我在这个课程的目标是 学习软件工程的基础 ...
- 2022师大高级软件工程博客作业
项目 内容 这个作业属于哪个课程 2022年师大高级软件工程 这个作业的要求在哪里 软件工程 案例分析作业 我在这个课程的目标是 通过对软件工程的深入了解,深入分析市面已经成功的和未成功的软件,全面的 ...
- 集大1513 1514班 软件工程第二次作业评分与点评
谢谢按时完成作业的同学. 请大家在今后的作业中多思考,认真完成并注意作业的原创性. 学号 作业标题 作业地址 提交日期 分数 201521121087 微信APP简要分析 http://www.cnb ...
- 2016福州大学软件工程第二次作业成绩
第二次作业为结对项目之需求分析与原型设计 以下为作业成绩: 学号 姓名 昵称 评分 031402524 王智强 iphone2s 9 031402509 胡泽善 aiprogram 9 0314025 ...
- 2022OUC软件工程第二次作业-08组
第二次作业:深度学习基础 一.金知霖 一.视频学习心得及问题总结 人工智能:使一部机器像人一样进行感知.认知.决策.执行的人工程序或系统 人工智能三个层面:计算智能.感知智能.认知智能 机器学习的定义 ...
- 现代软件工程第二次作业-github初使用及CanTool需求文档
作业要求: 完成下面的题目,并在小组博客中写出整个操作过程及学习心得(图文并茂):(每人都要在小组博客中写出来,并注明姓名) 1.参照 http://www.cnblogs.com/xinz/p/38 ...
- 软件工程第二次作业(原型设计)
课程名称:软件工程实践 作业要求:结对第一次-原型设计(文献摘要热词统计) 结对学号:221600428 | 221600438 作业目标:了解NABCD模型,学习建立软件原型 原型工具:墨刀 PDF ...
最新文章
- 一根烟上热搜,先让AI看看你的肺
- win2003 IIS6,能访问html页 但是不能访问aspx页解决办法汇总
- 七十五、Python | Leetcode哈希表系列
- 解析poj页面获取题目
- 2016十大优秀jQuery插件推荐
- 消融实验——Ablation experiment
- [cerc2012][Gym100624C]20181013
- python实现给定信号生成任意信噪比的带噪声信号
- java中怎样创建线程_java中的线程创建和使用
- Jar mismatch! Fix your dependencies的问题(转)
- Java中的properties文件中的key不能使用项目中的接口名和Java文件名
- DB2开发系列之一——基本语法
- cocos creator 文字描边效果
- asp小偷转html,ASP之XMLHTTP小偷程序的简单代码范例
- 基于java象棋游戏_基于JAVA技术的中国象棋游戏设计与实现
- GNSS螺旋天线高精度定位
- CCFCSP历年认证考试真题解答汇总(已解决20道,持续更新ing)
- 关于商城商品表设计(一)
- keil ARM 生成BIN文件的两种方式,直接复制就能用
- Apache Doris 的一场编译之旅