软工实践第二次作业

Github:https://github.com/031502216/softWare

作业地址:http://www.cnblogs.com/easteast/p/7469291.html

PSP 2.1表格

PSP2.1 Personal Software Process Stages 预估耗时(分钟) 实际耗时(分钟)
Planning 计划  --  --
· Estimate · 估计这个任务需要多少时间  15h  20h
Development 开发  --  --
· Analysis · 需求分析 (包括学习新技术)  3h  5h
· Design Spec · 生成设计文档  30min  30min
· Design Review · 设计复审 (和同事审核设计文档)  --  --
· Coding Standard · 代码规范 (为目前的开发制定合适的规范)  10min  10min
· Design · 具体设计  20min  30min
· Coding · 具体编码  5h  8h
· Code Review · 代码复审  2h  2h
· Test · 测试(自我测试,修改代码,提交修改)  2h  2h
Reporting 报告  --  --
· Test Report · 测试报告  45min  1h
· Size Measurement · 计算工作量  15min  30min
· Postmortem & Process Improvement Plan · 事后总结, 并提出过程改进计划  30min  1h
合计    13h30min  20h40min

学习进度条:

时间    
新增代码(行)


本周学习耗时(小时)


累计学习耗时(小时)

重要成长

2017.9.3-2017-9.10

200 20 20 对回溯法有了更深的认识,C++挺久没有接触了,这一次写的有些吃力,还有一些以前没有接触过的工具要一步步调试,觉得挺有收获,不过看着自己和有些人在编程这方面确实存在很大差距,所以接下来要加把劲了。
...        

解题思路:

由于许久没有写过c++,所以感觉很多之前学的知识都已经没有什么印象,只能一点点回忆,慢慢完成本次作业,。在拿到题目后,自己先动手解了一下数独,发现解是可以解出来,但是没有找到特别的好技巧,只能慢慢推理。然后查询了一些专门的解数独教程,方法也是多种多样,但是能够提供解决问题算法的没有太多,后来参考部分的网上资料,大致提供了两种解决方法,分别是回溯和置换。置换法对于本题不太合适,那就使用回溯法。从问题的某一种状态(初始状态)出发,搜索从这种状态出发所能达到的所有“状态”,当一条路走到“尽头”的时候(不能再前进),再后退一步或若干步,从另一种可能“状态”出发,继续搜索,直到所有的“路径”(状态)都试探过。这种不断“前进”、不断“回溯”寻找解的方法,就称作“回溯法”。但是在回溯的过程中怎么样才能将所有符合条件的数独全部输出呢?数独一般都是提供几个数字,然后根据规则填入相应的格子,但是本题是固定了左上角的数字,然后输出满足条件的数独,并非解数独那种单一的解法结构。但是相同的是需要用同一种规则去判断,生成的结果是一个81格的数独。

实现的时候有几个问题:

1.不能生成相同的数独,那么在生成第一个数独以后怎么把第二个数独输出?

2.一个个的按顺序往格子里填写数字,是不是对于性能方面有许多限制,浪费很多时间。

3.看到一些人在使用的时候使用了rand()这种随机函数,这种方法是否对于生成数独性能上和唯一性上有较大的提升?

综合这些问题,再去寻找答案,心里对于回溯这个方法还是比较认可,也是一个效率相对较高的方法。

设计实现:

代码中有两个函数,back()回溯函数和Isvaild()判断放置数字是否合法。

工作流程图:

代码说明:

bool Isvaild(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 Row = row / 3 * 3;
    int Col = col / 3 * 3;
    for(j = Row; j < Row + 3;++j){
        for(int k = Col; k < Col + 3; ++k){
            if(map[j][k] == map[row][col] && j != row && k != col){
                return false;
            }
        }
    }
    return true;
}
void back(int k,int request){   //进行回溯
    while(1)
    {
        int i = k/9;
        int j = k%9;  

        while(1)
        {
            map[i][j]++;
            if(map[i][j] == 10)
            {
                map[i][j] = 0;
                --k;
                break;
            }
            else if(Isvaild(k))
            {
                ++k;
                break;
            }
        }
        if(k == 81)
        {
            for(int i = 0; i < 9; ++i){
                for(int j =  0; j < 9; ++j){
                    fout<<map[i][j]<<" ";
                    //cout<<map[i][j]<<" ";
                }
                fout<<endl;
                //cout<<endl;
            }
            num++;
            fout<<endl;
            //cout<<endl;
            if(num >= request)
                return;  

            --k;
        }

    } 

测试运行:

测试运行:

n=1000时

由上述截图可以看出back()回溯函数占用了75%的时间,所占用的比例较重。

在本次作业实现过程中,我是发觉了自己的程序其实是有很大的优化空间的,但是由于时间和能力限制,并没有去实现,但是接下来会去尝试。以下提供一个解决问题的更好的思路可以减少回溯的次数例如dfs深度优先算法还有一个博客推荐的算法跳转链接也可以尝试,都比目前的方法更加优化。在本次的作业中,确实发现自身有很多不足的地方,包括对学术钻研的心态和能力,这是以后要努力的地方。

时间: 2024-12-20 23:41:16

软工实践第二次作业的相关文章

软工实践第二次作业-黄紫仪

1)Github项目地址 https://github.com/ziyi12345/shudu2.git 2)在开始实现程序之前,在下述PSP表格记录下你估计将在程序的各个模块的开发上耗费的时间 PSP2.1 Personal Software Process Stages 预估耗时(分钟) 实际耗时(分钟) Planning 计划 30 · Estimate · 估计这个任务需要多少时间 30 Development 开发 260 · Analysis · 需求分析 (包括学习新技术) 60

西北师大-18软工】第二次作业成绩汇总

[西北师大-18软工]第二次作业成绩汇总 同学们在本学期第一次练习小项目,这个过程中一定遇到了许多困难,希望同学们认真反思得失.同时要认清编程能力薄弱的现实,抓紧时间补短板. 作业题目 实验二 软件工程个人项目 实验目的与要求 (1)掌握软件项目个人开发流程. (2)掌握Github上发布软件项目的操作方法 作业评分标准: 按时交 - 有分(满分30分,代码和博客各15分),检查项目包括: 未提交项目源码到Github上,代码部分不得分:未提交博客到班级博客上,博客部分不得分: 根据项目完成质量

201521123055 软工阅读第二次作业

Q1 在MSF团队模型中,任何技术项目都必须达到特定的关键质量目标,才能够被认为是成功的项目.任何一个角色无法实现其目标,都将危机整个项目. 因此,每个角色都将被认为是同等重要的,重要的决定都要共同做出. 众所周知,想要达到这种民主式的共识是很困难的,这使得项目推进的过程变得十分缓慢.在开发过程中有优先的任务需要完成,是否应该有这样的主次顺序?计算成本时是否应考虑到任务的重要程度? Q2 开发过程中,开发团队希望让用户直接接触到最新版本的软件,一边从用户那里收集反馈,这时开发团队会让特定的用户使

软工实践第一次作业-黄紫仪

软工实践第一次作业 前言:emmmm之前因为没太注意,想着计算机专业怎么会有软工实践.所以之前一直都没去管.等到开学才发现突然翻车.QAQ现在赶紧先来补交一下. (1)回想一下你初入大学时对计算机专业的畅想 当初你是如何做出选择计算机专业的决定的? 你认为过去两年中接触到的课程是否符合你对计算机专业的期待,为什么? 你觉得计算机是你喜欢的领域吗,它是你擅长的领域吗?   说到选择计算机,emmmm,某种意义上来说是打RPG游戏打出来的想法,因为很喜欢这类的游戏,所以也想去试着写一个属于自己的这种

软工实践总结作业

忽然间,说结束就结束了. 明明是一直以来觉得头疼无比.时间占用巨大的这门课程,在结束的时候,却没有想象中的轻松,反而有一丝失落. 1.课程总结: 翻开刚刚开课时写下的目标,字里行间读出的,半是憧憬,半是迷茫.计划中要做的,有一些没有完成: 原打算学习java,最后却学习了一些php和mysql: 想要学会更好的管理时间,熬夜的次数好像却更加频繁: 原以为可以初步成长为一个合格的pm,但是回头看看自己做的好像也不怎么样.. .当然,也有不少的收获: 学会了一些软件的使用,例如原型开发软件Axure

该死的软工实践

这学期给我最大的感觉是比之前的每学期过得都快,可能是比较忙吧.还记得刚开始的时候,栋哥说可以退选实验的时候,有人和我说:”好像软工实践很麻烦的样子,要不我们退了吧“.其实,我也有打过退堂鼓,以为自己学也可以做点东西,但是我还是抱着这样的想法”找个大腿抱,水一水吧,毕竟过了这学期,又可以少修几学分了“,然后就没有去退选了.接下来就是开始这软工实践的日子.该开始总是想得很美好,以为这学期结束会有一个产品,上面写着made by ***,到最后还是生出了一个比较low的东西,那是第一次真正实践的东西,

调研《构建之法》指导下的全国高校的历届软工实践作品、全国互联网+竞赛、物联网竞赛等各类全国性大学生信息化相关的竞赛平台的历届作品及其看法

1,豌豆荚一览 作品内容:主要是一款聚合阅读类作品,他收录了500+应用的内容,可以在一个应用里面,看完自己感兴趣的应用的最近更新的内容,更通俗的讲就是用一个应用代替其他阅读类的应用,你可以在豌豆荚一览中看到其他应用最新更新内容,比如可以看知乎日报,开眼,一个等等之类的..... 作品源于的平台:豌豆荚设计奖里的作品,链接:http://sspai.com/30278 作品的优势:我们手机里面有很多的应用,每天都要在这些应用花费很多时间,其中有一些可能下载下来都不会打开几次,但是删掉又可惜的,于

软工实践之团队项目

我们的队名: Clean Code 031302511 林培兴 031302623 张衍坤 031302223 翁翰帅 031302536 苏丽玲 031302505 黄晓辉(组长) 团队项目描述: 校园通 团队成员介绍:    林培兴:我和组长是结对项目中的队友,在结对项目中,我们很好地合作分工,结对作业也取得不错的成绩.我有一定的Java基础,软工实践以来,也开始在努力学习安卓,在安卓编程方面有一定的进步.在我们的队伍中,我的定位主要是编程方面,负责我们项目的一部分模块的编程任务. 张衍坤:

往届软工实践作品评述

描述 作品的内容:作品源于的平台或链接:你觉得的作品的优势和不足:你觉得入选你心目中最佳前三的理由:经过调研后,你的感受和对自己团队项目的期待. 作品一 作品的内容: Phylab-Web 官方描述: 支持通过选择物理实验序号进入相应物理实验预习报告页面. 个人理解: 一个制作物理实验预习报告的页面. 作品源连接: https://github.com/buaase/Phylab-Web/blob/master/docs/User-Interface.md 优势: 贴近大学生的实际需要,并且制作