软件工程-个人项目

 软件工程个人项目-数独实战

 

 一:项目地址

代码按照课程要求已经托管在github平台

gitub链接:https://github.com/1320170119

 

二.psp

 

 

 三.解题思路

1.提取了一下个人项目的关键问题

   a.生成数独

   b.求解数独

   c.github平台

   d.命令行参数

   e.文本读写定向输入输出

   f.单元测试

  g.代码覆盖率分析

  h.压力测试

  i.有效命令判断

2.分析了一下,已经掌握的知识和很容易解决的问题有:

 d,e,i

3.解决不会的问题

   a.求解和生成数独

    首先考虑是暴力搜索,由于时间限制放弃

   在网上搜索了一些关于求解数独的很多博客,看到了舞蹈连算法,可惜没实现放弃

   决定使用深度搜索,回溯。

   b.解决github平台使用

   首先看了官网的文档

  接下来考虑了集中客户端,并参看了一些博客对他们介绍

 决定使用github dekstop客户端

  尝试了hello world 很方便

  c.解决命令行参数

 教材上有,以前没细看

  d.单元测试,性能分析,及代码覆盖率分析

  网 上有讲的很好的文档,使用vs自带工具即可。

  不过代码覆盖率分析只在企业版有,只能借同学的企业版来测试

技术问题基本解决

四.设计实现过程

设计了5个模块,一个一个实现,在拼接起来

1.judge函数,判断求解数独

2.judge2函数,判断生成终局

3.fill函数,求解数独的suanfa

4.search函数生成终局算法

5.main函数,命令判断

附上手绘流程图

 

五.性能分析

采用了vs2015自带的性能分析工具

分析报告如下

 

 

 

 

 

通过分析工具

发现主要集中在了不断的判断和搜索回溯中

进行单元测试和代码覆盖率分析

 

六.代码说明

就是深度优先搜索加上回溯

感觉很像地图问题

后期在网上看到可以通过交换行列来生成跟多矩阵

试了下缺失效率在提升很多

不过竟然出现了重复,很无语。

附上代码

这是填写数独算法(不知道本博客为为什么粘贴不了文字

int Fill(int s, int x, int y)
{
    int x_next = 0, y_next = 0;
    if (y == 9)
    {
        x_next = x + 1;
        y_next = 1;
    }
    else
    {
        x_next = x;
        y_next = y + 1;
    }
    if (x >9)
    {
        return 1;
    }
    if (map[s][x][y] != 0)

    {
        if (Fill(s, x_next, y_next) == 1)return 1;

    }
    else

    {
        for (int i = 1; i <= 9; i++)
        {
            int t = i;
            if (Judge(s, x, y, t) == 1)

            {
                map[s][x][y] = t;
                if (Fill(s, x_next, y_next))return 1;
            }

            map[s][x][y] = 0;

        }




    }

    return 0;


}

生成终局的算法其实就是一个,只不过是求解一张全空的数独,同时按照要求,我的学号应该让左上角为2即可,附上代码

void Search(int x, int y)
{
    int k = 0;
    if (sum >= ask)
        return;
    if (x > 9)
    {
        for (int i = 1; i <= 9; i++)
        {

            for (int j = 1; j <= 9; j++)
            {
                fprintf(fp, "%d", map2[i][j]);
                if (j != 9)

                {
                    fprintf(fp, " ");
                }
            }

            fprintf(fp, "\n");
        }


        if (sum < ask)
        {
            fprintf(fp, "\n");
        }

        sum++;
        return;
    }

    int x_next;
    int y_next;
    if (y == 9)
    {
        x_next = x + 1;
        y_next = 1;
    }
    else
    {
        x_next = x;
        y_next = y + 1;
    }
    for (k = 1; k <= 9; k++)
    {
        if (sum >= ask)return;
        if (Judge2(x, y, k) == 1)
        {
            map2[x][y] = k;

            Search(x_next, y_next);
            map2[x][y] = 0;
        }

    }


    map2[x][y] = 0; return;
}

七.实际花费时间

 

 

 

 

---------------------------------------------------------------个人项目完成

posted @ 2018-04-15 00:21  tom刘  阅读(208)  评论(0)    收藏  举报