第二次作业——个人项目实战:数独

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.1Personal 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

执行力的理解:

        执行力,我认为是内心精神要求自己行动的一种力量,每一件事情都有每个人不同的见解,同时这个见解也伴随着一定的执行力,你喜欢某件事情可能你的内心驱使就比较大,执行力就比较强,就想尽快地、高效地把某件事情做完,如果不喜欢某件事情,内心驱使就比较小,执行力就比较差,对于这件事情则是能拖就拖,能不做就不做。

泛泛而谈的理解:

        做事情应付了事,做表面功夫,没有真正地去经历经验,解决实际问题,而只关心一些表面上的事情如何能够应付好,做的事情也没有什么深度,很多事情的意义都在于体验那个过程,增长自己的经历经验我们不能够应付了事。

posted @ 2017-09-10 22:38  连忠华  阅读(433)  评论(1编辑  收藏  举报