• 2020软件工程作业03


    软件工程第三次作业
    这个作业属于那个课程 https://edu.cnblogs.com/campus/zswxy/software-engineering-2017-1
    这个作业的要求 https://edu.cnblogs.com/campus/zswxy/software-engineering-2017-1/homework/10494
    这个作业的目标 完成数独
    作业正文 如下
    其他参考文献 百度

    1.github 项目地址:

    https://github.com/pck0916/TEXT/blob/master/%E4%BD%9C%E4%B8%9A3.txt

    2.PSP表格

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

    3.解题思路描述.

    刚开始看到这个题目的时候.就感觉很难,产生了畏难心理,然后就去百度,问同学。过了好一阵子才慢慢找到头绪,自己对编程学习学得太差,所以遇到难题就显得毫无办法。

    经过找资料,查百度,才用了回溯法解决这个问题。

    4.具体代码:

    #include <stdio.h>
    int a[9][9];
     
    int place(int x, int y) //二者分别是数组对应的行地址和列地址,取值为0-8
    {
    int up, down, left, right;
    int i,j;
     
    up=x/3*3;
    down=up+3;
     
    left=y/3*3;
    right=left+3;
     
    //以下分三种情况判断是否在x,y对应的位置放这个数,如果不可以放,返回0,如果可以放,返回1,会进一步迭代

    for(i=0;i<9;i++){
    if(a[x][y]==a[i][y] && i!=x && a[i][y]!=0)
    return 0;
    }
     
    for(i=0;i<9;i++){
    if (a[x][y]==a[x][i] && i!=y && a[x][i]!=0)
    return 0;
    }
     
    for(i=up;i<down;i++)
    {
    for(j=left;j<right;j++)
    if(i!=x || j!=y)
    {
    if(a[i][j]==a[x][y] && a[i][j]!=0)
    return 0;
    }
    }
     
    return 1;
    }
     
     
    void backtrack(int t)
    {
    int i,j;
    int x,y;
     
    if(t==81)
    {
    printf(" ============================= ");
    for(i=0;i<9;i++)
    {
    for(j=0;j<9;j++)
    printf("%d",a[i][j]);
     
    putchar(' ');
    }
    }
    else
    {
    x=t/9;
    y=t%9; //将这个转换为相应的数组行坐标和列坐标
     
    if(a[x][y]!=0)
    {
    backtrack(t+1);
    }
    else
    {
    for(i=1;i<10;i++)
    {
    a[x][y]=i;
    if(place(x,y)==1)
    backtrack(t+1);
    a[x][y]=0;
    }
    }
    }
    }
     
    int main()
    {
    char str[9][9];
    int i,j;
     
    for(i=0;i<9;i++)
    gets(str[i]);
     
    for(i=0;i<9;i++)
    for(j=0;j<9;j++)
    a[i][j]=str[i][j]-'0';

    backtrack(0);
     
    return 0;
     
    }

    递归回溯方法说明:

    第一步:遍历预处理过的矩阵的每一个元素,通过对行,列以及周围格子的检查,得出该位置所有可能的侯选数值。
    第二步:通过一个check函数去检查更新过的数独的结果,有三种情况。
    1.数独已经被全部填完并正确。
    2.数独还有空未填。
    3.该数独不满足规则。
    第三步:根据上述check的情况,分别对应三种情况:
    1.先把此次答案打印出来,然后返回上一次递归继续解题,查看是否有多解。
    2.选取未填的格子里面侯选数最少的一个格子选填一个侯选值,执行第二步。
    3.退出当前的尝试,返回上一次递归并换下一个可能的侯选值。

    5.心路历程与收获

    这次作业虽然是马虎的完成了,但是还有很多地方没有涉及到,原因很简单,就是自己学得不好,在以后的学习中再慢慢的去学习和改进吧。经过这次的作业,发现了自己和别人差距还是很大的,有的人做得很完美,而我却做得不好。所以在以后的学习中还是得努力查漏补缺。

    6.评分表

    学号 姓名 作业头 Github项目地址 代码静态检查 PSP表格 解题思路描述 设计实现过程 代码说明 心路历程感想 总分
    20177675 彭倡科 2 1 0 1 0.5 1 0.5 1 7
  • 相关阅读:
    Atitit 提升开发进度大方法--高频功能与步骤的优化 类似性能优化
    Atitit 翻页功能的解决方案与版本历史 v4 r49
    Atitit.pagging  翻页功能解决方案专题 与 目录大纲 v3 r44.docx
    Atitit 视图参数解决方案 oracle版和mysql版本 attilax总结.docx
    Atitit easyui翻页组件与vue的集成解决方案attilax总结
    Atitit  技术经理职责与流程表总结
    Atitit 数据库视图与表的wrap与层级查询规范
    Atitit 手机图片备份解决方案attilax总结
    Atitit 提升进度的大原则与方法  高层方法  attilax总结
    Atiitt 使用java语言编写sql函数或存储过程
  • 原文地址:https://www.cnblogs.com/pcka/p/12619067.html
Copyright © 2020-2023  润新知