软件工程实践第三次作业

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每个数字在每一行、每一列中都只出现一次,不考虑宫;
四宫格:盘面是2
2四个宫,每一宫又分为22四个小格。使1-4每个数字在每一行、每一列和每一宫中都只出现一次;
五宫格:盘面是5
5。使1-5每个数字在每一行、每一列中都只出现一次,不考虑宫;
六宫格:盘面是23六个宫,每一宫又分为32六个小格。使1-6每个数字在每一行、每一列和每一宫中都只出现一次;
七宫格:盘面是77。使1-7每个数字在每一行、每一列中都只出现一次,不考虑宫;
八宫格:盘面是4
2八个宫,每一宫又分为24八个小格。使1-8每个数字在每一行、每一列和每一宫中都只出现一次;
九宫格:盘面是3
3九个宫,每一宫又分为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

posted @ 2019-09-25 22:58  sky_jiang  阅读(192)  评论(2编辑  收藏  举报