zoukankan      html  css  js  c++  java
  • 高级软件工程第二次作业

    GitHub地址:

    项目地址:https://github.com/zhoujingping/project1

    搭建环境:win10  64位

    使用工具:VC6.0

    使用语言:c++

    解题思路:

    我的解题思路大致分为三步:

    第一步:初始化二维数组num[0][i]和一维数组b[i],使得这两个数组存入1-9互不相同的随机数,num数组是用来存放结果,b数组当中的随机值在符合条件的情况下用来依次插入到num数组。

    如何产生1-9互不相同的随机数?我的思路大致是这样的:先把1-9依次存入a数组当中,然后产生随机数下标,使得b[i]=a[index],index是随机数,为了避免产生一样的随机数,每赋值一次,使a[index]标记为0。

    第二步:利用回溯法依次对要插入的位置进行对值的判断和选择,回溯法所在函数分为四个分支

    判断行大于第九行时,则结束

    判断符合check函数条件,则填入相关数字

    判断b中的元素是否已经用完

    判断当没有合适的数字可以填入时,则递归下一个准备填入的数字

    第三步:check函数

    判断行数字是否相等

    判断列数字是否相等

    判断小九宫格数字是否相等。

    流程图:

    代码说明:

    #include<iostream>
    #include<ctime>
    #include<fstream>
    using namespace std;
    int num[9][9];
    int b[9],a[9];
    bool check(int i,int j,int k)
    {
        int m,n;
        //判断行是否相同
        for(n=0;n<9;n++) 
        {
            if(num[i][n] == k)
                return false;
        }
        //判断列是否相同
        for(m=0;m<9;m++)
        {
            if(num[m][j]==k)
            return false;
        }
        //判断块是否相同
        int t1=(i/3)*3,t2=(j/3)*3;
        for(m=t1;m<t1+3;m++)
        {
            for(n=t2;n<t2+3;n++)
            {
                if(num[m][n] == k)
                    return false;
            }
        }
        return true;
    }
    bool sudoku(int i, int j, int *a) {
        //如果大于第九行,则结束
        if (i > 8) {
            return true;
        }
        //符合check函数条件,则填入
        if (check(i, j, *a)){
            num[i][j] = *a;
            if (sudoku(i + (j + 1) / 9, (j + 1) % 9, b)) {//从i行的元素一个一个依次递归,填入相应符合条件的数字
                return true;
            }
        }
        num[i][j] = 0;
        //判断b中的元素是否已经用完
        if (a - b >= 8) {
            return false;
        }
        //若没有合适的数字可以填入,则递归下一个准备填入的数字是否符合
        if (sudoku(i, j, a + 1)) {
            return true;
        }    
    }
    
    int main(){
        int i,j,index,n,z;
         ofstream location_out;
        location_out.open("sudoku.txt", std::ios::out | std::ios::app); 
        srand(unsigned(time(0)));
        cin>>n;
        for(z=0;z<n;z++){
            for(i=0;i<9;i++){
                    a[i]=i+1;
            }     //生成一个数组存放1-9
            for(i=0;i<9;){
                index=rand()%9;
                if(a[index]!=0){
                num[0][i]=a[index];   //生成随机数下标,并赋值给num,b,使得num,b存入1-9互不相同的随机数
                b[i]=a[index];
                a[index]=0;
                ++i;
                }
            }
        
            sudoku(1,0,b);
            for(i=0;i<9;i++)
            {
                for(j=0;j<9;j++){
                  cout<<num[i][j]<<" ";
                  location_out<<num[i][j]<<" ";
                }
                cout<<endl;
                location_out<<endl;
             
            }
            cout<<endl;
            location_out<<endl;
            for(i=0;i<9;i++){
                for(j=0;j<9;j++){
                num[i][j]=0;
            }
            }
        }
        return 0;
    }

     运行结果:

    PSP表格:

            

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

    性能测试:

    我的感想:

          这道题我是写不出来的,只能不断的百度,不断的去看百度上的代码,不断的去看别人的思路,不断的尝试,我花了很长时间,也很焦虑,但我觉得自己有在进步,我的算法还非常差,但我相信会越来越好。

  • 相关阅读:
    selenium(六)Page Object模式(使用selenium的PageFactory)
    CodeForces 1325C Ehab and Path-etic MEXs(思维)
    CodeForces 1325D Ehab the Xorcist(异或和+算数和)
    家庭房产(模拟)
    取硬币(思维)
    Xor and Sum(异或和+算术和)
    一元三次方程求解(数学、二分)
    最大最小公倍数 (数学、贪心)
    天梯---球队“食物链”(DFS+剪枝)
    HDU-4857 逃生(逆向拓扑排序)
  • 原文地址:https://www.cnblogs.com/zjp17/p/7641736.html
Copyright © 2011-2022 走看看