第二次作业——个人项目实战:数独
1、阅读
刚开始泛看《构建之法》的时候,还是觉得非常难理解里面的内容,特别是代码部分。后来第二次拿起这本书,从第一章开始看起,慢慢了解了“软件企业=软件+商业模式”和对软件工程的定义,但是更多地还是记忆了一遍,没有明白这里面的深意;看第二章的时候,跟着单元测试、回归测试的、效能分析的内容自己照着书上的代码敲了一敲,偶尔会出现bug,但是能得到书上所说的效果还是很开心的,效能分析,感觉就是代码的效率问题,追求高效,然后接触到了软件工程师的一套模型—个人开发流程PSP,我也尝试建立自己的GitHub来管理自己的源代码。第三章就感觉在看故事了:一个软件工程师的成长,积累问题相关领域知识和经验、提升技能;理解通用软件设计思想和软件工程思想;提升职业技能;实际成果。剩下的暂时还没看。
2、数独
数独介绍:(摘自百度百科)
数独是源自18世纪瑞士的一种数学游戏。是一种运用纸、笔进行演算的逻辑游戏。玩家需要根据9×9盘面上的已知数字,推理出所有剩余空格的数字,并满足每一行、每一列、每一个粗线宫(3*3)内的数字均含1-9,不重复。
数独盘面是个九宫,每一宫又分为九个小格。在这八十一格中给出一定的已知数字和解题条件,利用逻辑和推理,在其他的空格上填入1-9的数字。使1-9每个数字在每一行、每一列和每一宫中都只出现一次,所以又称“九宫格”。
解题历程:
数独?什么是数独?好的,开始百度。玩家需要根据9×9盘面上的已知数字,推理出所有剩余空格的数字,并满足每一行、每一列、每一个粗线宫(3*3)内的数字均含1-9,不重复,这是不是类似于以前做的找规律的数学题?然后慢慢懂了后,代码又不懂,继续百度,看到网上很多大神写的博客有关于数独的解法,摒弃法,用整形一维数组来表示数独的状态,用Num(80)表示数独的状态(数组的下标从0开始),数独是一个二维表格,而数组是一维数组,自己也尝试着用这个方法去求解数独,但是过程中遇到了自己很多不懂的概念和算法,越做心里的状态越糟糕,到最后自己放弃了。然后又开始用回溯法,在百度看了很多大神的回溯法解数独,自己也开始有了思路。
工具清单:
- 编程语言: C++
- 编程IDE:Visual Studio 2015
- 效能分析工具:Visual Studio Profiling Tools
- 源代码管理平台:Github
代码部分:
-
#include <iostream>
#include <algorithm>
using namespace std;
int map[9][9];
bool isPlace(int count){
int row = count / 9;
int col = count % 9;
int j;
for(j = 0; j < 9; ++j){
if(map[row][j] == map[row][col] && j != col){
return false;
}
}
for(j = 0; j < 9; ++j){
if(map[j][col] == map[row][col] && j != row){
return false;
}
}
int tempRow = row / 3 * 3;
int tempCol = col / 3 * 3;
for(j = tempRow; j < tempRow + 3;++j){
for(int k = tempCol; k < tempCol + 3; ++k){
if(map[j][k] == map[row][col] && j != row && k != col){
return false;
}
}
}
return true;
}
void backtrace(int count){
if(count == 81){
cout<<"结果:"<<endl;
for(int i = 0; i < 9; ++i){
for(int j = 0; j < 9; ++j){
cout<<map[i][j]<<" ";
}
cout<<endl;
}
return;
}
int row = count / 9;
int col = count % 9;
if(map[row][col] == 0){
for(int i = 1; i <= 9; ++i){
map[row][col] = i;
if(isPlace(count)){
backtrace(count+1);
}
}
map[row][col] = 0;
}else{
backtrace(count+1);
}
}
int main()
{
for(int i = 0; i < 9; ++i){
for(int j = 0; j < 9; ++j){
cin>>map[i][j];
}
}
backtrace(0);
return 0;
}
测试数据:
8 0 0 0 0 0 0 0 1
9 0 0 0 2 0 0 0 3
0 3 0 0 5 0 0 7 0
0 0 5 0 0 0 4 0 0
0 0 4 5 0 9 6 0 0
0 0 0 8 0 1 0 0 0
0 0 0 0 0 0 0 0 0
0 4 6 0 0 0 8 2 0
0 2 0 3 0 5 0 9 0
测试结果:
PSP2.1:
PSP2.1 | Personal Software Process Stages | 预估耗时(分钟) | 实际耗时(分钟) |
---|---|---|---|
Planning | 计划 | 10 | 30 |
· Estimate | · 估计这个任务需要多少时间 | 500 | 800 |
Development | 开发 | 100 | 200 |
· Analysis | · 需求分析 (包括学习新技术) | 30 | 50 |
· Design Spec | · 生成设计文档 | 50 | 30 |
· Design Review | · 设计复审 (和同事审核设计文档) | 70 | 30 |
· Coding Standard | · 代码规范 (为目前的开发制定合适的规范) | 10 | 20 |
· Design | · 具体设计 | 20 | 30 |
· Coding | · 具体编码 | 400 | 600 |
· Code Review | · 代码复审 | 40 | 60 |
· Test | · 测试(自我测试,修改代码,提交修改) | 50 | 60 |
Reporting | 报告 | 40 | 70 |
· Test Report | · 测试报告 | 50 | 50 |
· Size Measurement | · 计算工作量 | 50 | 70 |
· Postmortem & Process Improvement Plan | · 事后总结, 并提出过程改进计划 | 50 | 40 |
合计 | 总计 | 1470 | 2140 |
执行力的理解:
执行力,我认为是内心精神要求自己行动的一种力量,每一件事情都有每个人不同的见解,同时这个见解也伴随着一定的执行力,你喜欢某件事情可能你的内心驱使就比较大,执行力就比较强,就想尽快地、高效地把某件事情做完,如果不喜欢某件事情,内心驱使就比较小,执行力就比较差,对于这件事情则是能拖就拖,能不做就不做。
泛泛而谈的理解:
做事情应付了事,做表面功夫,没有真正地去经历经验,解决实际问题,而只关心一些表面上的事情如何能够应付好,做的事情也没有什么深度,很多事情的意义都在于体验那个过程,增长自己的经历经验我们不能够应付了事。