软工实践_Task2

标签(空格分隔): 软工实践


相关要求:第二次作业——个人项目实战

github:传送门


解题思路

  • 先是一点杂谈。

  • 首先,看完作业要求之后,心里先有个大概的框架。

    • 语言:C++
    • IDE:本机已安装Visual Studio 2015
    • 效能分析工具:Visual Studio Profiling Tools?善用搜索引擎,下一个。
    • 项目需求:很直观的想法是,一共\(9*9\)个位置,每个位置都随意的填上一个可满足的数,最后形成九宫格。
    • 注意:命令行输入,文件输出,输出格式,\(0<N<=1000000\),左上角的第一个数有特殊要求
    • github:文件组织框架
    • PSP:小说.push(《构建之法》)
    • 暂不考虑附加题
  • 再次细看博客之后,发现一些注意点:

    • 生成的棋盘不重复

      • 一种想法是每生成一个棋盘之后都check一下这个棋盘是否生成过,但是考虑到输入的N的范围,显然这么做过于耗费时间。
      • 换一个路子,既然不能每次都\(check\),那么就得让每次填数的随机性要足够的高。
    • 测试数据中有可能出现错误
      • 注意特殊处理。
    • 使用单元测试对项目进行测试,并使用插件查看测试分支覆盖率等指标。
    • 代码有进展即签入Github
    • 性能分析图,VS 2015的性能分析工具可自动生成。
  • 这样,大概就有个思路,要去怎么实现。结合上述的注意点,考虑到时间、随机性问题,一开始的直观的想法显然需要改进。

  • 考虑第一行,他肯定是一个1到9的排列。

  • 考虑到每个位置只有9种选择,所以每次都rand是不需要的,只要每次从1到9一个个试,check能否填。

  • 考虑到这样子随机性可能不是太好,所以可以再改进一下,每次不必按1到9的顺序去试数,而是将这个试数的序列也随机化,这样子能改善随机性。


设计实现

  • class:

    • Sudoku类:

      • 构造、析构函数
      • void SudokuGenerate(); 【publish,生成一个数独】
      • void SudokuPrint(); 【publish,输出一个数独】
      • void getNext(int &i, int &j); 【private,得到下一个位置】
      • bool judge(int row, int col, int curnum); 【private,判断(row, col)这个位置放curnum是否合理】
      • bool dfs(int i, int j); 【private,递归填数】
      • void Generate(); 【private,生成数独】
      • void print(); 【private,输出数独】
  • bool digitCheck(char *s) 【判断当前是否是一个整数】
  • int main(int argc, char *argv[])
    • 从命令行获取输入,调用digitCheck函数判断该输入是否合法。
    • 若输入不合法,输出提示信息。
    • 否则,实例化Sudoku类,调用SudokuGenerate生成一个数独,调用SudokuPrint输出这个数独

代码说明

  • bool Sudoku::judge(int row, int col, int curnum);

    • 判断(row, col)这个位置放curnum是否合理,判断方法为,当前行/当前列/当前块是否已经填过curnum这个数
bool Sudoku::judge(int row, int col, int curnum)
{
// check the col
rep(i, 0, row)
if (sudoku[i][col] == curnum) return false;
// check the row
rep(j, 0, col)
if (sudoku[row][j] == curnum) return false;
// check the area
int belongRow = row / 3 * 3;
int belongCol = col / 3 * 3; // get the upleft of the area
int index = (row % 3) * 3 + (col % 3);
while (--index >= 0)
{
if (sudoku[belongRow + index / 3][belongCol + index % 3] == curnum) return false;
}
return true;
}
  • bool Sudoku::dfs(int i, int j)

    • 递归填数,当(i, j)位置可以填某个数,且填该数可以得到解时,填这个数。
bool Sudoku::dfs(int i, int j)
{
if (i == 9) return true;
for (auto &curnum : trynum)
{
if (judge(i, j, curnum))
{
sudoku[i][j] = curnum;
int _i = i;
int _j = j;
getNext(_i, _j);
if (dfs(_i, _j)) return true;
sudoku[i][j] = 0;
}
}
return false;
}

测试运行


性能测试

上图的运行参数为【sudoku.exe -c 100000】,可以看到,总执行时间为57.4s,其中SudokuGenerate和SudokuPrint占了较大的比重。


题外话

  • 很绝望啊喂,一回到学校,笔记本就进水GG,项目也还没传github,最后还是在实验室配了半天的VS外加借舍友电脑,匆匆忙忙的写完了基本的作业需求。

软件工程实践_Task2_sudoku的更多相关文章

  1. 关于Axure RP软件的介绍——软件工程实践第二次个人作业

    关于Axure RP软件的介绍——软件工程实践第二次个人作业 Axure RP是一个非常专业的快速原型设计的一个工具,客户提出需求,然后根据需求定义和规格.设计功能和界面的专家能够快速创建应用软件或W ...

  2. 福州大学软件工程1816 | W班 第10次作业[软件工程实践总结]

    作业链接 个人作业--软件工程实践总结 评分细则 本次由五个问题(每个十分)+创意照片(五分)+附加题(十分)组成 评分统计图 千帆竞发图 汇总成绩排名链接 汇总链接

  3. 个人作业——软件工程实践总结&个人技术博客

    一. 回望 (1)对比开篇博客你对课程目标和期待,"希望通过实践锻炼,增强软件工程专业的能力和就业竞争力",对比目前的所学所练所得,在哪些方面达到了你的期待和目标,哪些方面还存在哪 ...

  4. 【The final】软件工程实践总结

    软件工程就这么告一段落了,竟然有那么一丢丢的舍不得-- 一.为拖延找的种种借口     [首先声明]以下纯粹是个人吐槽,仅作记录以便日后自己可以回顾一下往昔罢了,可以直接忽略,跳到第二大点:我的拖延之 ...

  5. 软件工程实践助教每周小结 < 福州大学 | 傅明建 >

    第一周助教小结 1. 助教博客链接: http://www.cnblogs.com/sinceway/ 2. 本周点评的作业数量:约22份,有多次交互 3. 本周点评有困难的作业链接: https:/ ...

  6. 软件工程实践一 —— java之wc.exe

    SoftwareEngineering-wc github项目地址:https://github.com/CuiLam/SoftwareEngineering-wc   项目相关要求 实现一个统计程序 ...

  7. 【软件工程实践一】git使用心得

    第一次软工实践,我们需要做的是学习如何使用github,并将本地库的文件添加到远程库中,以下是我进行实践的工程. [一.git的安装及准备工作] 首先从http://msysgit.github.io ...

  8. 软件工程实践-WC项目之C实现

    1.Github项目地址 https://github.com/ShadowEvan/homework 基本功能 -c 统计文件字符数(实现) -w 统计文件词数(实现) -l  统计文件行数(实现) ...

  9. [福大软工] Z班 软件工程实践总结 作业成绩

    作业要求 http://www.cnblogs.com/easteast/p/8081265.html 评分细则 本次作业评分满分为20分,分为五个部分,分别如下: 回望过去(5'):以实际数据总结分 ...

随机推荐

  1. process_begin: CreateProcess(NULL,......) make (e=87): 参数错误。

    在编译 trinity-android 的过程中,总是报 process_begin: CreateProcess(NULL,......) make (e=87): 参数错误 原因是.MK文件中包含 ...

  2. Storm 入门教程

    在这个教程中,你将学会如何创建 Storm 的topology并将他们部署到 Storm 集群上, 主要的语言是 Java,但是少数几个例子用 Python 编写来说明 Storm 的多语言支持能力. ...

  3. RocketMQ的broker启动失败解决

    RocketMQ的broker用如下命令启动: nohup sh bin/mqbroker -n localhost:9876 & 使用jps查看,系统非常卡顿,broker的名字也未显示.使 ...

  4. Script error.深度测试

    Script error.全面解析中我们介绍了Script error.的由来.这篇博客,我们将各种情况(不同浏览器.本地远程托管JS文件)考虑进去,进行一个深度的测试,为读者带来一个全面的了解. G ...

  5. sql server:Monty Hall problem (蒙提霍尔问题)

    --------------------------------------------------------------------- -- Auxiliry Table of Numbers 数 ...

  6. 深入研究HTML5实现图片压缩上传

    上篇文章中提到移动端上传图片,我们知道现在流量还是挺贵的,手机的像素是越来越高,拍个照动不动就是好几M,伤不起.虽然客户端可以轻轻松松实现图片压缩再上传,但是我们的应用还可能在浏览器里面打开,怎么办呢 ...

  7. [笔记] imooc《JavaScript深入浅出》对象与函数

    懒得做草稿了,习惯md也懒得扔印象笔记 主要是之前没去接触这一部分,就随手记下来了 创建对象的方法 对象字面量 new构造器/原型链 Object.create() 属性操作 属性读写(以及读写异常. ...

  8. JavaScript异步和单线程

    一,同步和异步的区别: 同步会阻塞代码执行,而异步不会.(比如alert是同步,setTimeout是异步) 二,前端使用异步的场景: 1,定时任务:setTimeout,setInterval 2, ...

  9. 机器学习是万能的吗?AI落地有哪些先决条件?

    机器学习是万能的吗?AI落地有哪些先决条件? https://mp.weixin.qq.com/s/9rNY2YA3BMpoY8NQ_rVIjQ 1.引言 入门机器学习或从事其相关工作前,不知道你思考 ...

  10. sqlserver配置实践

    对于一套新的sqlserver服务器,我们首先要对它做一些必要的优化配置,确保在生产上比较长的时间段内可以比较稳定的,良好的运行. 新的sqlserver服务器上安装的sqlserver版本,可以选择 ...