sudoku--SE第二次作业

git传送门


编译环境:

windows10、vs2017

所用语言:

c++

首先作为一个晚上闭眼的玩家,我先来讲一下我的心路历程:

       最开始接到作业的时候心里是拒绝的,刚出了一趟小远门就这样,就很难受,等回到家马不停蹄得开始写数独。前期想了挺久的,没什么头绪,挺着急的,后来在《编程之美》上看到了一种解法,觉得挺新奇的,根据题目要求,我把他改成了自己的一种思路(思路链接)。在手动验证可行性后呢,就开始编写代码了。
       因为这种思路实现起来挺简单的,编写过程中出错不多也迅速解决了,就不多赘述了,其中主要的函数为两个交换函数(行交换、列交换)
//行交换
void HS(int a, int b, int c, int d)
{
for (int j = 0; j < 3; j++)
{
sudoku[c][d + j] = sudoku[a + 1][b + j];
sudoku[c + 1][d + j] = sudoku[a + 2][b + j];
sudoku[c + 2][d + j] = sudoku[a][b + j];
}
} //列交换函数
void LS(int a, int b, int c, int d)
{
for (int j = 0; j < 3; j++)
{
sudoku[c + j][d] = sudoku[a + j][b + 2];
sudoku[c + j][d + 1] = sudoku[a + j][b];
sudoku[c + j][d + 2] = sudoku[a + j][b + 1];
}
}
       我的思路中是完成了左上角第一个九宫格的随机生成,尔后去经过行列变换生成其余的九宫格。两个函数中的参数a、b、c、d为坐标,即原始九宫格的左上角坐标(a,b),目标九宫格的左上角坐标(c,d),通过两个坐标完成九宫格的搭建。

这个时候问题来了

       理论上随机一个九宫格内的数,且左上角的数字固定的情形下,生成的数独情况只有8!种,也就是40320种,离题目要求的数还有很大的差距,该如何解决?
       因为思路中数独除去左上角的第一个九宫格是随机生成的,而其他的则是由其变化而来,而变化的顺序不影响其准确性,如下
B1 B2 B3
B4 B5 B6
B7 B8 B9
B2由B1行变化得来,B3由B2行变换得来是可行的,或者B3又B1行变换得来,B2由B3行变换得来也是允许的。B4、B7同。故而,B2、B3、B4、B7的变换便有4种不同的形式。再接着,B5、B6、B8、B9可以由B2、B3列变换得到,也可由B4、B7换变换得来,变换顺序也有4种,故而多出8种。一共就有了8440320=1290240种,理论上突破了一百万的大关。

以下是运行结果

结果图1sudoku--SE第二次作业

结果图2sudoku--SE第二次作业

单元测试

       到现在也只写出了简单的单元测试,就很难受,而且按照教程出不来覆盖率,难受成200斤的胖子。

sudoku--SE第二次作业

性能分析

sudoku--SE第二次作业

sudoku--SE第二次作业

sudoku--SE第二次作业

sudoku--SE第二次作业

PSP

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

收获

本次的学习,收获了以下
  • 认识了以前重来没有用过的单元测试等功能,感觉自己又朝着低级程序员迈进了一步。
  • deadline才是第一生产力
  • git还是一如既往的容易出错(小白的心声)
  • 我短暂的玩耍时光没了,很难受
  • 感觉这次的作业和以往的编程有很大的区别,除了难度上,让人感觉更加的像是一个“小小小项目”,而不单单是打代码。
  • 最后收获了又一次的心态崩溃

针对执行力 、 泛泛而谈 的理解:

       执行力百度百科给出的解释是

执行力是指有效利用资源、保质保量达成目标的能力,指的是贯彻战略意图,完成预定目标的操作能力。是把企业战略、规划、目标转化成为效益、成果的关键。

对我理解而言,即是利用好我们手头能收集到的资料、优质老师资源等,保质保量得完成我们的任务,为执行力。而泛泛而谈,是我们这几年养成的一个坏习惯,所有事在说不清楚的情况下就喜欢用一些很空的词带过去,这点很坏无疑。为了改成这点,我会努力在接下来的时间内逐渐的将这些词改掉,拿出实际的数据来,希望大家指教。

第二次更新

之前跑100万的数据要几分钟,后来将vs里面的debug改成release后,只需要30秒左右就可以了

---------------------------------------持续更新(09.10)-----------------------------------------------

上一篇:[one day one question] webpack打包压缩 ES6 js、.vue报错


下一篇:Linux性能优化实战学习笔记:第五十四讲