sudoku--SE第二次作业
编译环境:
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种,理论上突破了一百万的大关。
以下是运行结果
结果图1
结果图2
单元测试
到现在也只写出了简单的单元测试,就很难受,而且按照教程出不来覆盖率,难受成200斤的胖子。
性能分析
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还是一如既往的容易出错(小白的心声)
- 我短暂的玩耍时光没了,很难受
- 感觉这次的作业和以往的编程有很大的区别,除了难度上,让人感觉更加的像是一个“小小小项目”,而不单单是打代码。
- 最后收获了又一次的心态崩溃
针对执行力 、 泛泛而谈 的理解:
执行力百度百科给出的解释是
执行力是指有效利用资源、保质保量达成目标的能力,指的是贯彻战略意图,完成预定目标的操作能力。是把企业战略、规划、目标转化成为效益、成果的关键。