天天看点

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

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;

    }

    }

    if(map[j][col] == map[row][col] && j != row){

    }

    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;

    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 · 需求分析 (包括学习新技术) 50
· Design Spec · 生成设计文档
· Design Review · 设计复审 (和同事审核设计文档) 70
· Coding Standard · 代码规范 (为目前的开发制定合适的规范) 20
· Design · 具体设计
· Coding · 具体编码 400 600
· Code Review · 代码复审 40 60
· Test · 测试(自我测试,修改代码,提交修改)
Reporting 报告
· Test Report · 测试报告
· Size Measurement · 计算工作量
· Postmortem & Process Improvement Plan · 事后总结, 并提出过程改进计划
合计  总计  1470 2140

执行力的理解:

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

泛泛而谈的理解:

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

上一篇: 华为云