• 2020软件工程作业03


    这个作业属于哪个课程https://edu.cnblogs.com/campus/zswxy/software-engineering-2017-1
    这个作业要求在哪里 https://edu.cnblogs.com/campus/zswxy/software-engineering-2017-1/homework/10494
    这个作业的目标 画自己最想学的技术的学习路线图
    作业正文 https://www.cnblogs.com/linjin0806/p/12582098.html
    其他参考文献 https://www.baidu.com

    Github项目地址:https://github.com/linjin66/sudoku

    PSP表格

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

     

    解题思路

       我的主要思路就是对整个每一个宫格进行一个一个的检查,我定义了一个三维数组,前两个是用来存每一个宫格的盘面,第三个是用来存这个格子所能填的数字。对每一个各自进行检查,检查这个格子的行和列还有小宫格有哪些数字已经出现过,将其标记。最后检查哪些格子只有一个数字没有被标记就直接将其填入这个格子。然后重复上面的操作。当格子里没有0的时候就停止,输出。

    代码实现

    主函数实现

    int main(int argc, char* argv[])
    {
        int i, n, j, k;
        int id = 0;
        ifstream ifp;
        ofstream ofp;
        N = atoi(argv[2]);
        N = N + 1;
        n = atoi(argv[4]);
        ifp.open(argv[6]);
        if (!ifp.is_open())//判断文件是否成功打开
            cout << "File open failed" << endl;
        ofp.open(argv[8]);
        if (!ofp.is_open())
            cout << "File open failed" << endl;
        int count = 0;
        while (n--)
        {
            for (i = 1; i < N; i++)
                for (j = 1; j < N; j++)
                    ifp >> sudu[i][j][0];
    
            for (i = 1; i < N; i++)
                for (j = 1; j < N; j++)
                    for (k = 1; k < 10; k++)
                        sudu[i][j][k] = 1;
            inti();
            ofp << endl;
            int q = 5;
            while (q--)
            {
                for (i = 1; i < N; i++)
                {
                    for (j = 1; j < N; j++)
                        if (sudu[i][j][0] == 0)
                            inti();
                }
                for (i = 1; i < N; i++)
                    for (j = 1; j < N; j++)
                        if (sudu[i][j][0] == 0)
                            count++;
                if (count == 0)
                    break;
                count = 0;
            }
    
            for (i = 1; i < N; i++)
                for (j = 1; j < N; j++)
                {
                    if (sudu[i][j][0] == 0)
                        id++;
                }
            if (id != 0)
                solve(id);
            for (i = 1; i < N; i++)
            {
                for (j = 1; j < N; j++)
                {
                    ofp << sudu[i][j][0] << ' ';
                }
                ofp << endl;
            }
        }
        return 0;
    }

    实现代码

     1 void intgongge()
     2 {
     3     int i, j, k;
     4     int cnt = 0;
     5     for (i = 1; i < N; i++)
     6         for (j = 1; j < N; j++)
     7         {
     8             if (sudu[i][j][0] == 0)
     9             {
    10                 for (k = 1; k < N; k++)
    11                 {
    12                     if (sudu[i][k][0] != 0)
    13                         sudu[i][j][sudu[i][k][0]] = 0;
    14                 }
    15                 for (k = 1; k < N; k++)
    16                 {
    17                     if (sudu[k][j][0] != 0)
    18                         sudu[i][j][sudu[k][j][0]] = 0;
    19                 }
    20                 if (N == 5 || N == 7 || N == 9 || N == 10)
    21                 {
    22                     if (N == 10)
    23                         ninesudu(i, j);
    24                     if (N == 9)
    25                         eightsudu(i, j);
    26                     if (N == 7)
    27                         sixsudu(i, j);
    28                     if (N == 5)
    29                         foursudu(i, j);
    30                 }
    31                 for (k = 1; k < N; k++)
    32                 {
    33                     if (sudu[i][j][k] != 0)
    34                         cnt++;
    35                 }
    36                 if (cnt == 1)
    37                 {
    38                     for (k = 1; k < 10; k++)
    39                     {
    40                         if (sudu[i][j][k] != 0)
    41                         {
    42                             sudu[i][j][0] = k;
    43                             break;
    44                         }
    45                     }
    46                 }
    47             }
    48             cnt = 0;
    49         }
    50 }

     递归函数

     1 void fillnumber(int number, int i, int j) {
     2     for (int k = 1; k < N; k++) {
     3         sudu[i][k][number]++;
     4         sudu[k][j][number]++;
     5     }
     6     /*for (int n = 0; n < 3; n++) {
     7         for (int m = 0; m < 3; m++) {
     8             sudu[i / 3 * 3 + n][j / 3 * 3 + m][number]++;
     9         }
    10     }*/
    11 }
    12 void  resetnumber(int number, int i, int j) {
    13     for (int k = 1; k < N; k++) {
    14         sudu[i][k][number]--;
    15         sudu[k][j][number]--;
    16     }
    17     /*for (int n = 0; n < 3; n++) {
    18         for (int m = 0; m < 3; m++) {
    19             sudu[i / 3 * 3 + n][j / 3 * 3 + m][number]--;
    20         }
    21     }*/
    22 }
    23 void solve(int id)
    24 {
    25     if (id == 0)
    26         return;
    27     for (int i = 1; i < N; i++)
    28     {
    29         for (int j = 1; j < N; j++)
    30         {
    31             if (sudu[i][j][0] == 0)
    32             {
    33                 for (int number = 1; number < 10; number++)
    34                 {
    35                     if (sudu[i][j][number] == 0)
    36                     {
    37                         fillnumber(number, i, j);
    38                         sudu[i][j][0] = number;
    39                         solve(id - 1);
    40                         sudu[i][j][0] = 0;
    41                         resetnumber(number, i, j);
    42                     }
    43                 }
    44                 return;
    45             }
    46         }
    47     }
    48 }

    代码静态检查

    性能分析

     

    我在性能分析的时候不知道为什不能进行它的性能分析上次作业也是这样还没搞清楚。

    总结

       在这次的作业中,感觉自己不足的地方还有好多,本次作业感觉对于我来说有点难,因为自己的能力还不够,做起来有点吃力,老师讲的内容也运用不到实际应用上来,本次主要遇到的问题是参数难导入,自己在进行性能分析优化的时候总是出现问题,还没有完全解决,我的电脑在进行性能优化的时候总是遇到一些错误不知道是我的版本问题还是我的代码问题,但总的来说通过此次作业还是学到了不少的东西,最起码自己迈出了做代码的静态检查,性能优化的尝试,还有单元测试,虽然还有问题没解决没做到,但起码在不断进步。

    自我评价

    作业名称:2020软件工程作业03
    作业内容:
    学号 姓名 作业头 Github项目地址

    代码要求经过code Quality  analysis工具的分析并消除所有警告

    PSP表格 解题思路描述 设计实现过程 改进程序性能 代码说明

    结合构建之法谈心路历程和感想

    总分
    估计 实际 代码如何组织 关键函数画出流程图 单元测试的设计 找出瓶颈性能 改进 展示关键代码 解释思路与注释说明
    2分 1分 2分 0.5分 0.5分 1分 0.5分 1分 0.5分 0.5分 0.5分 0.5分 0.5分 1分 12分
    20177595 林金 2分 1分 1分 0.5分 0.5分 1分  0.5分  0分 0分  0.5分  0.5分  0.5分  0分  0.5分  8.5分 

  • 相关阅读:
    [ABC200E] Patisserie ABC 2
    [CF1521E] Nastia and a Beautiful Matrix
    [CF1498D] Bananas in a Microwave
    [CF1515B] Phoenix and Puzzle
    [CF1519C] Berland Regional
    [CF1519B] The Cake Is a Lie
    [ZONe Energy Programming Contest C] MAD TEAM
    [洛谷P7480] Reboot from Blue
    [CF1508A] Binary Literature
    1371. 货币系统
  • 原文地址:https://www.cnblogs.com/linjin0806/p/12582098.html
Copyright © 2020-2023  润新知