软件工程实践第三次作业
1、GITHUB网址
https://github.com/sky-jiang99/031702546
2、PSP表格
先上我的PSP
PSP2.1 | Personal Software Process Stages | 预估耗时(分钟) | 实际耗时(分钟) |
---|---|---|---|
Planning | 计划 | 20 | 40 |
Estimate | 估计这个任务需要多少时间 | 360 | 1000+ |
Development | 开发 | 120 | 120 |
Analysis | 需求分析 (包括学习新技术) | 100 | 60 |
Design Spec | 生成设计文档 | 50 | 30 |
Design Review | 设计复审 | 20 | 20 |
Coding Standard | 代码规范 (为目前的开发制定合适的规范) | 10 | 30 |
Design | 具体设计 | 30 | 90 |
Coding | 具体编码 | 120 | 180 |
Code Review | 代码复审 | 60 | 180 |
Test | 测试(自我测试,修改代码,提交修改) | 30 | 120 |
Reporting | 报告 | 30 | 60 |
Test Repor | 测试报告 | 60 | 60 |
Size Measurement | 计算工作量 | 10 | 5 |
Postmortem & Process Improvement Plan | 事后总结, 并提出过程改进计划 | 20 | 60 |
合计 |
3、解题思路
拿到这道题的时候我觉得,一张数独我自己也就十分钟左右就能做出来,而且是一直在重复行列宫搜索数字,计算机肯定能很快的解决啊。好简单的一道题。
(1)了解题目
百度百科简介:
数独盘面是个九宫,每一宫又分为九个小格。在这八十一格中给出一定的已知数字和解题条件,利用逻辑和推理,在其他的空格上填入1-9的数字。使1-9每个数字在每一行、每一列和每一宫中都只出现一次,所以又称“九宫格”。
具体任务:
现在我们想一步一步来,完成从三宫格到九宫格的进阶;完成三宫格和其他博客任务,就算过了初级考核,其他的算升级。具体各阶规则如下:
三宫格:盘面是33。使1-3每个数字在每一行、每一列中都只出现一次,不考虑宫;
四宫格:盘面是22四个宫,每一宫又分为22四个小格。使1-4每个数字在每一行、每一列和每一宫中都只出现一次;
五宫格:盘面是55。使1-5每个数字在每一行、每一列中都只出现一次,不考虑宫;
六宫格:盘面是23六个宫,每一宫又分为32六个小格。使1-6每个数字在每一行、每一列和每一宫中都只出现一次;
七宫格:盘面是77。使1-7每个数字在每一行、每一列中都只出现一次,不考虑宫;
八宫格:盘面是42八个宫,每一宫又分为24八个小格。使1-8每个数字在每一行、每一列和每一宫中都只出现一次;
九宫格:盘面是33九个宫,每一宫又分为3*3九个小格。使1-9每个数字在每一行、每一列和每一宫中都只出现一次;
(2)大致思路
数独无非就是行列宫不能出现重复的数字,独那么我认为n阶数每个格子都有满的n种可能性,然后根据已经填入的数字删除可能性,然后将没有可能性为1的数字填出,再将新填出的表盘的数字进行遍历,再在行列消除可能性,就循环这个过程就好了。稍稍想了一会儿后认为宫的独立性有点难,所以先做357阶没有宫的数独。
(3)具体思路
后来总结了一下,办法就是不断的将已填数据的行独立性、列独立性、宫独立性,辐射到整个盘面上,然后使盘面上某个空格唯一时,将该数据填入表盘,然后将该数字的独立性再次辐射出去,以此类推就能解决整个数独问题。以一个三阶数独为例:
因此创建数组时一共需要创建4个
int OutMap[10][10];//保存盘面以及填入的数字
bool Map[10][10][10];//前两位为坐标,第三位为数字,有可能性为1,无可能性为0
int Flag[10][10];//表示每个格子内可能性的数量
int NewMap[10][10];//表示每次填出的新表盘
之后只需要不断回溯行独立列独立宫独立,直到数盘内的每一个数字都被填上为止时输出数组就完成了
行和列独立性验证,如上面图标的例子,每个数字在辐射过它的独立性之后,其本身其实已经没有作用了。实际上,每个数字只需要辐射一次,因此我们只需要把每次新填入的数字辐射其独立性就好了,所以在每一次辐射独立性后都会把newmap清零,使得下一次不会重复遍历。
for (int i = 0; i < t; i++)
{
for (int j = 0; j < t; j++)
{
if (NewMap[i][j] != 0)//发现数独中有数字的格子,行列可能性消除后newmap清零
{
for (int k = 0; k < t; k++)
{
if (Map[i][k][NewMap[i][j]] = true || Flag[i][k] != 1)//如果格子可能性未消除且格子内无数字
{
Map[i][k][NewMap[i][j]] = false;//行可能性消除
Flag[i][k]--;//可能性减一
if (Flag[i][k] == 1)//如果可能性被减为1;则填入newmap和outmap中,同时charge--
{
for (int q = 0; q < t; q++)
{
if (Map[i][j][q] == true)
{
NewMap[i][j] = q;
OutMap[i][j] = q;
charge--;
if(charge==0)
{
break;
}
}
}
}
}
if (Map[k][j][NewMap[i][j]] = true || Flag[k][j] != 1)
{
Map[k][j][NewMap[i][j]] = false;//列的可能性消除
Flag[k][j]--;
if (Flag[k][j] == 1)
{
for (int q = 0; q < t; q++)
{
if (Map[i][j][q] == true)
{
NewMap[i][j] = q;
OutMap[i][j] = q;
charge--;
if (charge == 0)
{
break;
}
}
}
}
}
}
NewMap[i][j] == 0;//清零每一个已经做过可能性消除的数字
}
}
}
}
}
总结
这次代码真的打的很仓促,上个学期一整个学期没有打过代码,然后本身提前了5天准备开始结果一个vs2017就下了两天,71mb下载不知道为什么要下5个小时然后下完告诉不能装,重新下载。来来回回了好几次,结果第三天莫名其妙十秒钟下完直接开始安装了(凌乱)。代码删删改改只写了两天,然后开始弄个git,然后46mb下了4个小时,一直损坏,损坏了又重下。导致现在还没有传代码。所以这次作业的准备实在是不充分,所以没有按时完成要求。正在补ing