• 2020软件工程作业03


    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项目地址

    2.PSP表格

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

    3.需求

    实现一个命令行程序,不妨称之为Sudoku

    4.解题思路:

    到网上搜了很久,也请教了同学。但是自己基础不好,还是没搞懂。很多地方不会。哎。代码写在这里了。

    #include<iostream>

    using namespace std;

    int a[9][9];

    int t1,t2;

    //赋初值

    void add(int a[9][9])

    {

    for(int i=0;i<9;i++)

    {cout<<"输入第"<<i+1<<"行数据";

    for(int j=0;j<9;j++)

    {

    cin>>a[i][j];

    }

    }

    }

    void print(int a[9][9])

    {

    cout<<"========================"<<endl;

    for(int i=0;i<9;i++)

    {

    for(int j=0;j<9;j++)

    {

    cout<<a[i][j]<<" ";

    if((j+1)%3==0)

    cout<<"||";

    }

    cout<<endl;

    if((i+1) %3==0)

    cout<<"========================"<<endl;

    }

    }

    void check(int a[9][9])

    {

    int at=20;//让程序自己找几遍

    while(at--)

    {

    int p1,p2,p3,p4,p5,p6,p7,p8,p9;

    for(int i=0;i<9;i++)

    for(int j=0;j<9;j++)

    {

    if(a[i][j]==0)

    { int k=0;

                p1=p2=p3=p4=p5=p6=p7=p8=p9=1;

    //遍历九宫格

    int i1=(i/3)*3;

    int j1=(j/3)*3;

    for(int m=i1;m<i1+3;m++)

    {

    for(int n=j1;n<j1+3;n++)

    {

    if(a[m][n]==1&&p1--)

    {k++;}

    if(a[m][n]==2&&p2--)

    {k++;}

    if(a[m][n]==3&&p3--)

    {k++;}

    if(a[m][n]==4&&p4--)

    {k++;}

    if(a[m][n]==5&&p5--)

    {k++;}

    if(a[m][n]==6&&p6--)

    {k++;}

    if(a[m][n]==7&&p7--)

    {k++;}

    if(a[m][n]==8&&p8--)

    {k++;}

    if(a[m][n]==9&&p9--)

    {k++;}

    }

    }

    //九宫格遍历完,行遍历开始

    for(int jj=0;jj<9;jj++)

    {

    if(a[i][jj]==1&&p1)

    {k++;p1--;}

    if(a[i][jj]==2&&p2)

    {k++;p2--;}

    if(a[i][jj]==3&&p3)

    {k++;p3--;}

    if(a[i][jj]==4&&p4)

    {k++;p4--;}

    if(a[i][jj]==5&&p5)

    {k++;p5--;}

    if(a[i][jj]==6&&p6)

    {k++;p6--;}

    if(a[i][jj]==7&&p7)

    {k++;p7--;}

    if(a[i][jj]==8&&p8)

    {k++;p8--;}

    if(a[i][jj]==9&&p9)

    {k++;p9--;}

    }

    //行结束,列开始遍历

    for(int ii=0;ii<9;ii++)

    {

    if(a[ii][j]==1&&p1--)

    {k++;}

    if(a[ii][j]==2&&p2--)

    {k++;}

    if(a[ii][j]==3&&p3--)

    {k++;}

    if(a[ii][j]==4&&p4--)

    {k++;}

    if(a[ii][j]==5&&p5--)

    {k++;}

    if(a[ii][j]==6&&p6--)

    {k++;}

    if(a[ii][j]==7&&p7--)

    {k++;}

    if(a[ii][j]==8&&p8--)

    {k++;}

    if(a[ii][j]==9&&p9--)

    {k++;}

    }

    //列遍历完毕,k是否为8,是填数 否下一个

    //k为8 说明该空唯一因为 9-1=8

    if(k==8)

    //找p几不是0,那么该空就是p几对应的数

    {

    if(p1==1)

    a[i][j]=1;

    else if(p2==1)

    a[i][j]=2;

    else if(p3==1)

    a[i][j]=3;

    else if(p4==1)

    a[i][j]=4;

    else if(p5==1)

    a[i][j]=5;

    else if(p6==1)

    a[i][j]=6;

    else if(p7==1)

    a[i][j]=7;

    else if(p8==1)

    a[i][j]=8;

    else if(p9==1)

    a[i][j]=9;

    }//填数完成

    }//if结束

    }//大循环结束

    }//while结束

    }//check 结束

    //另一种数独简单方法,怎么说呢 在该数所在九宫格内 有一个数唯一的话就填

    void check_two(int a[9][9])

    {

    int coun=0;

    for(int r=0;r<3;r++)

    {

    for(int t=0;t<3;t++)

    {

    //填唯一的数

    for(int v1=1;v1<=9;v1++)

    {

    int count1=0;

    for(int v2=r*3;v2<r*3+3;v2++)

    {

    for(int v3=t*3;v3<t*3+3;v3++)

    {  int count=0;

    if(a[v2][v3]==0)

    {

    a[v2][v3]=v1;

    for(int m1=r*3;m1<r*3+3;m1++)

    for(int m2=t*3;m2<t*3+3;m2++)

    if(a[m1][m2]==v1)

    count++;

    //列判断

    for(int n1=0;n1<9;n1++)

    if(a[n1][v3]==v1)

    count++;

    //行判断

    for(int n2=0;n2<9;n2++)

    if(a[v2][n2]==v1)

    count++;

    //判断count==3  行 列 九宫格 +1

    if(count==3)

    {

    count1++;

    t1=v2,t2=v3;

    a[v2][v3]=0;            // 反正t1 t2 已经记下了v2 v3 而且只有一次才会正确,如果两次为0 也就是说已经不可能了

    }

    else                   //count连3都不等于 那么一定不是v1这个数 。。。置零

    a[v2][v3]=0;

    }//if a[v2][v3]==0

    }//3 for

    }//2 for

    if(count1==1&&a[t1][t2]==0)

    {a[t1][t2]=v1;

    }

    }//1 for

    coun=0;

    }//2 for

    }//1 for

    }

    //用来数 9x9 格子有几个不是0的

    int fi(int a[9][9])

    {

    int e=0;

    for(int i=0;i<9;i++)

    for(int j=0;j<9;j++)

    if(a[i][j]!=0)

    e++;

    return e;

    }

    void caishu(int a[9][9])//顾名思义 猜数 ,假设该格子为一个数 ,在调用上面方法

    {

    int a_cope[9][9];

    for(int i=0;i<9;i++)

    for(int j=0;j<9;j++)

    a_cope[i][j]=a[i][j];

     for(int m=0;m<9;m++)

     for(int n=0;n<9;n++)

     if(a_cope[m][n]==0)      

    for(int v=1;v<=9;v++)

         {

     a_cope[m][n]=v;   

     check(a_cope);     //这两个可以多来几遍

     check_two(a_cope); //这两个可以多来几遍 以保证数可以填完

     check(a_cope);

     check_two(a_cope);

     check(a_cope);

     check_two(a_cope);

     check(a_cope);

     check_two(a_cope);

    if(fi(a_cope)==81)

    { for(int f=0;f<9;f++)

     for(int g=0;g<9;g++)  

     a[f][g]=a_cope[f][g];

      break;

     }

    else

    {

    for(int i=0;i<9;i++)

    for(int j=0;j<9;j++)

    a_cope[i][j]=a[i][j];

    }

     }

    }

    int main()

    {

    cout<<"依次输入数独内容:"<<endl;

    add(a);

    check(a);

    check_two(a);

    check(a);

    check_two(a);

    check(a);

    print(a);

    if(fi(a)==81)

    {cout<<"所得结果如下:"<<endl;

    print(a);

    }

    else

    { caishu(a);

    print(a);

    }

    system("pause");

    return 0;

    }

  • 相关阅读:
    分布式系统的架构思路
    可汗学院超经典、超实用概率论总结——商女不知忘国恨,隔江犹看概率论
    傅里叶分析之掐死教程(完整版)
    谈谈敏捷开发
    C# 读xml注释或过滤xml注释
    CTF中那些脑洞大开的编码和加密
    C#关闭一个窗口的同时打开另一个窗口
    继《关于讯飞语音SDK开发学习》之打包过程中遇到小问题
    使用ffmpeg录音
    leetcode 1. Two Sum
  • 原文地址:https://www.cnblogs.com/1253www/p/12594234.html
Copyright © 2020-2023  润新知