软工实践_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 colrep(i, 0, row)if (sudoku[i][col] == curnum)  return false;// check the rowrep(j, 0, col)if (sudoku[row][j] == curnum)  return false;// check the areaint belongRow = row / 3 * 3;int belongCol = col / 3 * 3;   // get the upleft of the areaint 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外加借舍友电脑,匆匆忙忙的写完了基本的作业需求。

转载于:https://www.cnblogs.com/monsterJang/p/7502265.html

软件工程实践_Task2_sudoku相关推荐

  1. 软件工程python就业方向-软件工程实践总结

    软工ByeBye~ 请回望暑假时的第一次作业,你对于软件工程课程的想象 对比开篇博客你对课程目标和期待,"希望通过实践锻炼,增强计算机专业的能力和就业竞争力",对比目前的所学所练所 ...

  2. 软件工程实践2017第二次作业

    软件工程实践2017第二次作业 1)Github地址 https://github.com/Maple27/sudoku 2)解题思路 个人从小就对数独就很喜欢,对解数独有一定程度的了解,这次自己开发 ...

  3. 个人作业——软件工程实践总结

    一.请回望暑假时的第一次作业,你对于软件工程课程的想象 对比开篇博客你对课程目标和期待,"希望通过实践锻炼,增强计算机专业的能力和就业竞争力",对比目前的所学所练所得,在哪些方面达 ...

  4. 个人作业收官——软件工程实践总结

    个人作业收官--软件工程实践总结 一.回望开学初对于软件工程课程的想象,回望博客开篇时对于这门课和这学期的期望, 1)对比现在的你和开学初博客开篇的课程目标和期待. 能力的预期 1.对于java的一些 ...

  5. 软件工程专业(互联网应用开发与优化方向)软件工程实践二环节教学大纲

    软件工程专业(互联网应用开发与优化方向)软件工程实践二环节教学大纲 培训课程 Phthon Web开发 实训公司 XXX 总周数 3周

  6. 2017软件工程实践总结

    一.请回望暑假时的第一次作业,你对于软件工程课程的想象 1)对比开篇博客你对课程目标和期待,"希望通过实践锻炼,增强计算机专业的能力和就业竞争力",对比目前的所学所练所得,在哪些方 ...

  7. 『软件工程12』软件工程实践方法——软件测试

    软件工程实践方法-- 软件测试 一.软件测试概述 1.软件测试的目的 (1)从用户和开发者角度 (2)Myers软件测试目的 2.软件测试的原则 3.软件测试的对象 4.测试信息流 5.测试与软件开发 ...

  8. 三周的 软件工程实践课 课程安排建议

    不少学校想在暑期安排软件工程实践课, 在这么短的时间内要做到软件生命周期的完整体验是有很多挑战的,下面是一个建议: 软件工程课程设计 - 三周计划,10 次授课,10 次学生报告. 第一周,准备: 在 ...

  9. 2017软件工程实践

    课程信息  软件工程实践 参考教材 <构建之法>   作者:邹欣, 编辑:周筠 他山之石 北京航空航天大学    罗杰, 刘乾 东北师范大学          杨贵福 北京电子科技学院   ...

最新文章

  1. react-native 常用命令
  2. acl中in和out的区别
  3. 字符串之单词原地逆转
  4. 从源码角度剖析VC6下的内存分配与切割的运作
  5. IBM在中国发布Cloud Paks,牵手神州数码,助力企业云转型步入“第二篇章”
  6. 安装Vuecli新版本正常,但是显示版本是低版本
  7. 如何发表高水平论文(转载,非常好)
  8. Qt中利用定时器QTimer实时显示当前日期和时间
  9. 「docker实战篇」python的docker爬虫技术-在linux下mitmproxy介绍和安装(四)
  10. C++之获取配置文件值
  11. 以前的模板太糟糕了?
  12. LabVIEW FPGA PCIe开发讲解-实战篇:实验61:PCIe DMA+8位ADC(模拟数据采集卡)
  13. html font文本颜色 字体 大小标签元素
  14. 【学术写作规范】论文写作注意事项
  15. 大端模式和小端模式之“终极记忆”
  16. 不可不知的分组分析法
  17. 使用ffmpeg 命令行解码并显示像素格式为.raw图像
  18. 阿拉伯数字跟中文汉字互转js
  19. 【Python-5】Conditionals Control Flow
  20. JavaScript基础 ( 循环)

热门文章

  1. JavaScript数据类型之数字型(4)
  2. 计算C(n,0)+C(n,1)+...+C(n,m)--Problem B. Harvest of Apples
  3. C++ STL 遍历vector
  4. dp动态规划_最长上升子序列问题
  5. Istio 组件详解
  6. 最新高清IT职业技能图谱(15图)
  7. 深度学习:文本检测数据集整理
  8. 贺利坚老师汇编课程36笔记:[BX+SI+IDATA]和[BX+DI+IDATA]寻址
  9. 团队项目前期冲刺-7
  10. 并发编程之多线程基础-Thread和Runnable的区别及联系(二)