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

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

执行力的理解:

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

泛泛而谈的理解:

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

时间: 2024-10-09 02:11:02

第二次作业——个人项目实战:数独的相关文章

第二次作业——结对项目之需求分析与原型模型设计

031302331 031302223  汇总课表的困扰 针对汇总课表巨大的工作量,我们首先构建了NABCD模型: 一.下面是我们对汇总Excell项目的NABCD模型的理解 1.N(Need,需求) 对象:A.教务处:每个学期中间,第6周,教务处都要发布下学期的开课计划,而如果教务处群发邮件,显得有些麻烦,可以设计一个网站,教务处可以不用群发邮件给老师,减轻工作量. B.老师:开课计划书以群发邮件的形式发给所有老师后,而老师要在规定的时间内,将自己的名字填入自己希望报的课程的那一行 “任课教师

第二次作业--结对项目之需求分析与原型模型设计

备注:苏逸豪031302117 张建平031302528 采用的原型模型:Axure Rp讨论.细化和使用专用原型模型工具时的结对照片: 1>N(Need 需求) 通过客户的描述了解到,目前客户的困难在于教务处每学期第6周都会发布下学期开课计划,并且人工的吧计划书以邮件的形式群发给所有老师,老师则以邮件形式回复负责人,并且专人进行统计.这样做不仅工作量巨大,并且出错的可能性也不小.同时了解到学院没有专门针对这项工作的系统,因此我们认为设计一个选课开课系统是很有必要的,可以人工控制,把收发邮件以及

Solr集群、KI分词、项目实战

Solr是一个高性能,采用Java开发,基于Lucene的全文搜索服务器.同时对其进行了扩展,提供了比Lucene更为丰富的查询语言,同时实现了可配置.可扩展并对查询性能进行了优化,并且提供了一个完善的功能管理界面,是一款非常优秀的全文搜索引擎. 讲师本人之前在互联网大数据.国家水电数据中心方面的项目时,对海量数据的查询和检索都采用了solr的集群服务,达到高效的实时搜索效果,为满足越来越多大数据人才的需求,特意整理录制成视频,适合各层次学员学习本视频的知识点,当然课程中的知识点大家一看也就知道

【无私分享:ASP.NET CORE 项目实战(第二章)】添加EF上下文对象,添加接口、实现类以及无处不在的依赖注入(DI)

目录索引 [无私分享:ASP.NET CORE 项目实战]目录索引 简介 上一章,我们介绍了安装和新建控制器.视图,这一章我们来创建个数据模型,并且添加接口和实现类. 添加EF上下文对象 按照我们以前的习惯,我们还是新建几个文件夹 Commons:存放帮助类 Domians:数据模型 Services:接口和实现类 我们在Domains文件夹下添加一个类库 Domain 我们新建一个类 ApplicationDbContext 继承 DbContext 1 using Microsoft.Ent

【第二版】高仿Android网易云音乐企业级项目实战课程介绍

这是一门付费Android项目课程,我们只做付费课程:同时也感谢大家的支持. 这一节,对本课程做一个简单介绍,以及放一些项目效果图,如果想直接查看项目视频演示,可以直接在腾讯课堂查看[高仿Android网易云音乐企业级项目实战]课程第三节,让大家对该项目有一个整体的认识. 1 前言 我们课程学完都不能让你,年薪百万,出任CEO,走上人生巅峰. 2 课程简介 这是一门使用Java语言,从0开发一个Android平台,接近企业级的项目(我的云音乐). 课程包含了基础内容,高级内容,项目封装,项目重构

第二周作业-词频统计

本周作业是词频统计,编程具体要求如下: https://edu.cnblogs.com/campus/nenu/SWE2017FALL/homework/922 对实现功能进行简要的介绍: 功能一:小文件输入,为表明程序能跑.需要在控制台下输入命令,得到文件中不重复的总单词数.并对单词出现的次数进行排序输出. 功能二:支持命令行输入英文作品的文件名,亲自录入,输出显示不重复单词总数,并对出现频率最高的前10的单词进行输出 功能三:支持命令行输入存储有英文作品文件的目录名,批量统计词频. 功能四:

Spark大型项目实战:电商用户行为分析大数据平台

本项目主要讲解了一套应用于互联网电商企业中,使用Java.Spark等技术开发的大数据统计分析平台,对电商网站的各种用户行为(访问行为.页面跳转行为.购物行为.广告点击行为等)进行复杂的分析.用统计分析出来的数据,辅助公司中的PM(产品经理).数据分析师以及管理人员分析现有产品的情况,并根据用户行为分析结果持续改进产品的设计,以及调整公司的战略和业务.最终达到用大数据技术来帮助提升公司的业绩.营业额以及市场占有率的目标. 1.课程研发环境 开发工具: Eclipse Linux:CentOS 6

storm项目实战开发 Storm视频教程下载

Storm流计算从入门到精通-技术篇 课程分类:大数据 适合人群:初级 课时数量:25课时 用到技术:Storm集群.Zookeeper集群等 涉及项目:网站PV.UV案例实战.其他案例 更新程度:40% 持续更新中 storm项目实战开发 Storm视频教程下载地址:http://pan.baidu.com/s/1hq7Sqag Storm是什么? 为什么学习Storm? Storm是Twitter开源的分布式实时大数据处理框架,被业界称为实时版Hadoop. 随着越来越多的场景对Hadoop

Kafka项目实战-用户日志上报实时统计之应用概述

1.概述 本课程的视频教程地址:<Kafka实战项目之应用概述> 本课程是通过一个用户实时上报日志来展开的,通过介绍 Kafka 的业务和应用场景,并带着大家搭建本 Kafka 项目的实战开发环境.下面我们来看看本课程有哪些课时,如下图所示: 接下来,我们开始第一课时的学习:<Kafka 回顾>. 2.内容 2.1 Kafka 回顾 本课时简述 Kafka 平台部署的注意事项,以及 Kafka 在企业中的业务场景和应用场景.让大家了解 Kafka 在企业中的使用. 本课时主要包含以