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还是一如既往的容易出错(小白的心声)
- 我短暂的玩耍时光没了,很难受
- 感觉这次的作业和以往的编程有很大的区别,除了难度上,让人感觉更加的像是一个“小小小项目”,而不单单是打代码。
- 最后收获了又一次的心态崩溃
针对执行力 、 泛泛而谈 的理解:
执行力百度百科给出的解释是
执行力是指有效利用资源、保质保量达成目标的能力,指的是贯彻战略意图,完成预定目标的操作能力。是把企业战略、规划、目标转化成为效益、成果的关键。
对我理解而言,即是利用好我们手头能收集到的资料、优质老师资源等,保质保量得完成我们的任务,为执行力。而泛泛而谈,是我们这几年养成的一个坏习惯,所有事在说不清楚的情况下就喜欢用一些很空的词带过去,这点很坏无疑。为了改成这点,我会努力在接下来的时间内逐渐的将这些词改掉,拿出实际的数据来,希望大家指教。
第二次更新
之前跑100万的数据要几分钟,后来将vs里面的debug改成release后,只需要30秒左右就可以了
---------------------------------------持续更新(09.10)-----------------------------------------------
sudoku--SE第二次作业的更多相关文章
- Sudoku(第二次作业)
这里是github 工具清单: 编程语言:C++ 编程IDE:XCode 效能分析工具:XCode 源代码管理平台:Github PSP2.1 PSP2.1 Personal Software Pro ...
- 第二次作业——个人项目实战(sudoku)
第二次作业--个人项目实战(sudoku) 一.作业要求地址 第二次作业--个人项目实战 二.Github项目地址 softengineering1--sudoku 三.PSP表格估计耗时 PSP2. ...
- 第二次作业:卷积神经网络 part 2
第二次作业:卷积神经网络 part 2 问题总结 输出层激活函数是否有必要? 为什么DnCNN要输出残差图片?图像复原又该如何操作? DSCMR中的J2损失函数效果并不明显,为什么还要引入呢? 代码练 ...
- 耿丹CS16-2班第二次作业汇总
-- Deadline: 2016-09-28 12:00 -- 作业内容:http://www.cnblogs.com/huangjunlian/p/5891726.html -- 第二次作业总结: ...
- JAVA第二次作业展示与学习心得
JAVA第二次作业展示与学习心得 在这一次作业中,我学习了复选框,密码框两种新的组件,并通过一个邮箱登录界面将两种组件运用了起来.具体的使用方法和其他得组件并没有什么大的不同. 另外我通过查阅资料使用 ...
- 20169212《Linux内核原理与分析》第二周作业
<Linux内核原理与分析>第二周作业 这一周学习了MOOCLinux内核分析的第一讲,计算机是如何工作的?由于本科对相关知识的不熟悉,所以感觉有的知识理解起来了有一定的难度,不过多查查资 ...
- 软件工程(QLGY2015)第二次作业点评(随机挑选20组点评)
相关博文目录: 第一次作业点评 第二次作业点评 第三次作业点评 说明:随机挑选20组点评,大家可以看看blog名字,github项目名字,看看那种是更好的,可以学习,每个小组都会反应出一些问题,希望能 ...
- 程序设计第二次作业<1>
面向对象程序设计第二次作业<1> Github 链接:https://github.com/Wasdns/object-oriented 题目: <1>第一次尝试 我立马认识到 ...
- homework-02,第二次作业——寻找矩阵最大子序列和
经过漫漫漫~~~~~~~~~~~~~~长的编译和调试,第二次作业终于告一段落了 先放出源码,思路后面慢慢道来 #include<stdio.h> #include<stdlib.h& ...
- 20169210《Linux内核原理与分析》第二周作业
<Linux内核原理与分析>第二周作业 本周作业分为两部分:第一部分为观看学习视频并完成实验楼实验一:第二部分为看<Linux内核设计与实现>1.2.18章并安装配置内核. 第 ...
随机推荐
- [BZOJ 1054][HAOI 2008]移动玩具 状态压缩
考试的时候一看是河南省选题,觉得会很难,有点不敢想正解.感觉是个状压.但是一看是十年前的题,那怂什么! 直接把十六个数的状态压进去,因为个数是不变的,所以状态枚举的时候只要找数目一样的转移即可.而且只 ...
- org.apache.commons.io——FileUtils学习笔记
FileUtils类的应用 1.写入一个文件: 2.从文件中读取: 3.创建一个文件夹,包括文件夹: 4.复制文件和文件夹: 5.删除文件和文件夹: 6.从URL地址中获取文件: 7.通过文件过滤器和 ...
- sqlite 的基本使用2
sqlite的运算符有好几种,算术运算符,比较运算符,逻辑运算符,位运算符 1,算术运算符 算术运算符主要有 + - * . % (取余)这个很简单,举一个例子就行,要达到这样的效果需要格式化行输出 ...
- UE4 距离场简单分析
距离上一篇博客已经有点久了,中间忙的飞起,忽然发现很久没写了,这样不好,写一篇和工作无关的吧. 一直想搞清UE4距离场的原理,网上有几乎找不到任何有关UE4距离场实现的内容,加上上篇末说要写一个完全的 ...
- 如何实现.5px的线条和.5px的圆角边框
实现.5px的线条 网络上有很多方法,如设置viewport,box-shawdow,border-image,background-image,transform:scale等,这里不做介绍(百度或 ...
- javascript如何创建一个换行节点
换行节点和其他节点的创建方式一样,使用document.createElement("br");创建节点, 并使用parentNode.appendChild()将节点插入到相应的 ...
- 教程:基于访问控制的ABAP CDS视图权限
Hi! 对每一个CDS视图,我们都可以通过DCL(Data Control Language)定义访问控制.在这篇文章中,我会介绍ABAP CDS视图中非常重要的一面:权限管理. 本文的阐述基于我正在 ...
- ASP.NET MVC5写.php路由匹配时的问题 ASP.NET MVC 4 在 .NET 4.0 与.NET 4.5 的專案範本差異
由于外包公司结束合作,所以考虑把其APP服务替换过来,因原后台是用php写的,在不影响员客户端使用的情况下在MVC下重写路由配置实现处理原php链接地址的请求,但实现时发现怎么也匹配不到自己写的路由, ...
- Git 默认不区分大小写
背景: 通过代码规范,修改了包名为全小写(修改了文件夹目录),但发现push后,git服务器的文件夹目录还是为大写 解决方法: git默认是不区分大小写的,意思是你修改一个文件名/文件夹的时候,git ...
- ArrayList和CopyOnWriteArrayList
这篇文章的目的如下: 了解一下ArrayList的增删改查实现原理 看看为什么说ArrayList查询快而增删慢? CopyOnWriteArrayList为什么并发安全且性能比Vector好 1. ...