软件工程实践第三次作业

1、GITHUB网址
https://github.com/sky-jiang99/031702546

2、PSP表格

先上我的PSP

PSP2.1Personal Software Process Stages预估耗时(分钟)实际耗时(分钟)
Planning计划2040
Estimate估计这个任务需要多少时间3601000+
Development开发120120
Analysis需求分析 (包括学习新技术)10060
Design Spec生成设计文档5030
Design Review设计复审2020
Coding Standard代码规范 (为目前的开发制定合适的规范)1030
Design具体设计3090
Coding具体编码120180
Code Review代码复审60180
Test测试(自我测试,修改代码,提交修改)30120
Reporting报告3060
Test Repor测试报告6060
Size Measurement计算工作量105
Postmortem & Process Improvement Plan事后总结, 并提出过程改进计划2060
合计

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每个数字在每一行、每一列和每一宫中都只出现一次;

1797364-20190925210116654-1354115589.png

(2)大致思路

数独无非就是行列宫不能出现重复的数字,独那么我认为n阶数每个格子都有满的n种可能性,然后根据已经填入的数字删除可能性,然后将没有可能性为1的数字填出,再将新填出的表盘的数字进行遍历,再在行列消除可能性,就循环这个过程就好了。稍稍想了一会儿后认为宫的独立性有点难,所以先做357阶没有宫的数独。

(3)具体思路

后来总结了一下,办法就是不断的将已填数据的行独立性、列独立性、宫独立性,辐射到整个盘面上,然后使盘面上某个空格唯一时,将该数据填入表盘,然后将该数字的独立性再次辐射出去,以此类推就能解决整个数独问题。以一个三阶数独为例:
1797364-20190925204010697-147451581.png
1797364-20190925204026464-977707158.png

因此创建数组时一共需要创建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

转载于:https://www.cnblogs.com/sky-jiang99/p/11588230.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值