其他分享
首页 > 其他分享> > 软件工程实践2019第三次作业

软件工程实践2019第三次作业

作者:互联网

PSP表格

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

代码

主函数,用的是深度搜索。4、6、8、9是有宫的,分四个不同的函数搜索。3、5、6是无宫的,可以放在一起。

int main(int argc, char** argv)
{

    ifstream infile;
    ofstream outfile;
    if (argc == 1)
    {
        m = 3, n = 1;
        outfile.open("g:\\软工实践\\output.txt");
        infile.open("g:\\软工实践\\input.txt");
    }
    else
    {
        m = atoi(argv[2]);
        n = atoi(argv[4]);
        outfile.open("g:\\软工实践\\output.txt");
        infile.open("g:\\软工实践\\input.txt");
    }
    while (n--)
    {

        for (int i = 1; i <= m; i++)
            for (int j = 1; j <= m; j++)
            {

                char c;
                infile >> c;
                int t;
                t = c - 48;
                if (t != 0)
                {
                    if (m == 3 || m == 5 || m == 7) p[i][t] = l[j][t] = fz[i][j] = true;
                    if (m == 4) p[i][t] = l[j][t] = fz[(i - 1) / 2 * 2 + (j - 1) / 2 + 1][t] = true;
                    if (m == 6) p[i][t] = l[j][t] = fz[(i - 1) / 2 * 2 + (j - 1) / 3 + 1][t] = true;
                    if (m == 8) p[i][t] = l[j][t] = fz[(i - 1) / 4 * 4 + (j - 1) / 2 + 1][t] = true;
                    if (m == 9) p[i][t] = l[j][t] = fz[(i - 1) / 3 * 3 + (j - 1) / 3 + 1][t] = true;
                }

                sd[i][j] = t;
            }
        if (m == 3 || m == 5 || m == 7) dfsm(1, 1);
        if (m == 4) dfs4(1, 1);
        if (m == 6) dfs6(1, 1);
        if (m == 8) dfs8(1, 1);
        if (m == 9) dfs9(1, 1);
        memset(p, 0, sizeof(p));
        memset(l, 0, sizeof(l));
        memset(fz, 0, sizeof(fz));
    }

//cout<<"k="<<k<<endl;outfile <<"k="<<k<<endl
    for (int i = 1; i < k; i++)
    {
        cout << sudoku[i] << " "; outfile << sudoku[i] << " ";
        if (i%m == 0)
        {
            cout << endl; outfile << endl;
            //cout<<"i="<<i<<endl;outfile <<"i="<<i<<endl
            if(i%(m*m)==0)
            {
                cout << endl; outfile << endl;
             } 
        }

    }
    
    return 0;
}

深度搜索函数,有宫的时候,比如九宫格,每增加三行,宫格序号加三,每增加三列,宫格序号加一。

void dfsm(int x, int y)
{
    ;
    if (sd[x][y] != 0)//如果原来这个位置有数字,跳过。 
        if (x == m && y == m) out();
        else if (y == m)dfsm(x + 1, 1);
        else dfsm(x, y + 1);
    else//原来的地方没有数字,准备填充 
        for (int i = 1; i <= m; i++)
            if ((!p[x][i]) && (!l[y][i]))
            {
                sd[x][y] = i;
                p[x][i] = l[y][i] = true;
                if (x == m && y == m) out();
                else if (y == m)dfsm(x + 1, 1);
                else dfsm(x, y + 1);
                sd[x][y] = 0;
                p[x][i] = l[y][i] = false;
            }
}
void dfs4(int x, int y)
{
    if (sd[x][y] != 0)
        if (x == 4 && y == 4) out();
        else if (y == 4)dfs4(x + 1, 1);
        else dfs4(x, y + 1);
    else
        for (int i = 1; i <= 4; i++)
            if ((!p[x][i]) && (!l[y][i]) && (!fz[(x - 1) / 2 * 2 + (y - 1) / 2 + 1][i]))
            {
                sd[x][y] = i;
                p[x][i] = l[y][i] = fz[(x - 1) / 4 * 4 + (y - 1) / 2 + 1][i] = true;
                if (x == 4 && y == 4) out();
                else if (y == 4)dfs4(x + 1, 1);
                else dfs4(x, y + 1);
                sd[x][y] = 0;
                p[x][i] = l[y][i] = fz[(x - 1) / 2 * 2 + (y - 1) / 2 + 1][i] = false;
            }
}
void dfs6(int x, int y)
{
    if (sd[x][y] != 0)
        if (x == 6 && y == 6) out();
        else if (y == 6)dfs6(x + 1, 1);
        else dfs6(x, y + 1);
    else
        for (int i = 1; i <= 6; i++)
            if ((!p[x][i]) && (!l[y][i]) && (!fz[(x - 1) / 2 * 2 + (y - 1) / 3 + 1][i]))
            {
                sd[x][y] = i;
                p[x][i] = l[y][i] = fz[(x - 1) / 2 * 2 + (y - 1) / 3 + 1][i] = true;
                if (x == 6 && y == 6) out();
                else if (y == 6)dfs6(x + 1, 1);
                else dfs6(x, y + 1);
                sd[x][y] = 0;
                p[x][i] = l[y][i] = fz[(x - 1) / 2 * 2 + (y - 1) / 3 + 1][i] = false;
            }
}
void dfs8(int x, int y)
{
    if (sd[x][y] != 0)
        if (x == 8 && y == 8) out();
        else if (y == 8)dfs8(x + 1, 1);
        else dfs8(x, y + 1);
    else
        for (int i = 1; i <= 8; i++)
            if ((!p[x][i]) && (!l[y][i]) && (!fz[(x - 1) / 4 * 4 + (y - 1) / 2 + 1][i]))
            {
                sd[x][y] = i;
                p[x][i] = l[y][i] = fz[(x - 1) / 4 * 4 + (y - 1) / 2 + 1][i] = true;
                if (x == 8 && y == 8) out();
                else if (y == 8)dfs8(x + 1, 1);
                else dfs8(x, y + 1);
                sd[x][y] = 0;
                p[x][i] = l[y][i] = fz[(x - 1) / 4 * 4 + (y - 1) / 2 + 1][i] = false;
            }
}
void dfs9(int x, int y)
{
    if (sd[x][y] != 0)
        if (x == 9 && y == 9) out();
        else if (y == 9)dfs9(x + 1, 1);
        else dfs9(x, y + 1);
    else
        for (int i = 1; i <= 9; i++)
            if ((!p[x][i]) && (!l[y][i]) && (!fz[(x - 1) / 3 * 3 + (y - 1) / 3 + 1][i]))

            {
                sd[x][y] = i;
                p[x][i] = l[y][i] = fz[(x - 1) / 3 * 3 + (y - 1) / 3 + 1][i] = true;
                if (x == 9 && y == 9) out();
                else if (y == 9)dfs9(x + 1, 1);
                else dfs9(x, y + 1);
                sd[x][y] = 0;
                p[x][i] = l[y][i] = fz[(x - 1) / 3 * 3 + (y - 1) / 3 + 1][i] = false;
            }
}

存数组,有n个数独,每个将其存到sudoku数组中

void out()
{

    for (int i = 1; i <= m; i++)
    {
        for (int j = 1; j <= m; j++)
        {
            sudoku[k++] = sd[i][j];
        }

    }

    //  memset(sd, 0, sizeof(sd));

}

一些头文件,注意#include<bits/stdc++.h>这个万能头文件vs里

#include <bits/stdc++.h>
#include<fstream> 
using namespace std;
int sd[11][11], m, sudoku[100000] = { 0 }, k = 1,n,t;//数独数组,n宫格 
bool p[11][11], l[11][11], fz[11][11];//排,列,方阵。

测试数据

三宫格
此处输入图片的描述
四宫格
此处输入图片的描述
五宫格
此处输入图片的描述
六宫格
此处输入图片的描述
七宫格
此处输入图片的描述
八宫格
此处输入图片的描述

性能分析


首先,数独需要用到深度搜索,这个知识点有点忘记,花了一定的时间去复习。然后文件的输入输出这一块我弄了好久,也问了好多大佬最后才修改成现在的样子,勉强能用吧。最后就是devc用多了,一下子改到vs有点不习惯,学会了一些基本操作和分析。

标签:11,int,0.5,fz,作业,软件工程,2019,true,宫格
来源: https://www.cnblogs.com/lllovehhh/p/11587903.html