高级软件工程第二次作业

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

性能测试:

我的感想:

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

 

posted on 2017-10-09 16:46  周静平  阅读(186)  评论(1)    收藏  举报

导航