软件工程实践第二次作业--个人项目实战

我的GitHub项目地址
经过今天的努力,总算把第一个生成数独的版本做出来了。源码传到GitHub上了。。。但是居然不能创建文件夹,还要安装Git插件。。。昨天和今天的时间主要花在思考编码和调试上了。还久没写c++了,感觉有点生疏,所以第一个版本不能接受命令行参数,也不能将输出输出到文本。。。这就有点伤了,不过做项目就是这样,在不断晚上的过程中提升自己的能力,明天继续改代码。今天先说说思路,这个数独主要是每生成一个数就判断这个数能不能符合要求。现将判断的代码贴到下面:

bool judgePosition(vector<vector<int>> &a, int row, int col)
{
    int val = a[row][col];
    //首先判断行列是否满足要求
    for (int i = 0; i < row; i++)
    {
        if (a[i][col] == val)
            return false;
    }
    for (int j = 0; j < col; j++)
    {
        if (a[row][j] == val)
            return false;
    }
    //接着判断小九宫格里是否满足要求,首先得算出需要判断的这个点所在九宫的位置
    int temp1 = row / 3;
    int row_begin = temp1 * 3;
    int row_end = row_begin + 2;
    int temp2 = col / 3;
    int col_begin = temp2 * 3;
    int col_end = col_begin + 2;
    int i = row_begin, j = col_begin;
    for (int k = 1; k <= 8; k++)
    {
        if (i == row&&j == col)
            break;
        else if (a[i][j] == val)
            return false;
        if (j == col_end)
        {
            j = col_begin;
            i = i + 1;
        }
        else
        {
            j = j + 1;
        }
    }
    return true;
}

该判断方法调用递归,个人感觉效率上很差。。。接下来要用效能分析进行改进。利用随机数来生成数字,使用的rand()和srand()函数参见该博客。下面就是生成数字的代码:

bool generator(vector<vector<int>> &a, int row, int col)
{
    //利用vector容器
    vector<int> generate;
    for (int i = 1; i <= 9; i++)
        generate.push_back(i);
    //产生随机数下标,生成数独中该位置的随机数
    while (!generate.empty())
    {
        int index = rand() % generate.size();
        a[row][col] = generate[index];
        generate.erase(generate.begin() + index);
        if (judgePosition(a, row, col) == false)
            continue;
        if (row == 8 && col == 8)
        {
            return true;
        }
        int nextRow, nextCol;
        if (col == 8)
        {
            nextRow = row + 1;
            nextCol = 0;
        }
        else
        {
            nextRow = row;
            nextCol = col + 1;
        }
        bool nextPoint = generator(a, nextRow, nextCol);
        if (nextPoint)
            return true;
    }
    if (generate.empty())
    {
        a[row][col] = -100;
        return false;
    }
}

一开始那个生成随机数的算式如下1229512-20170917221329547-847483891.png这样会出现不能取到不重复数的情况:

1229512-20170917221122344-1524261793.png
但是内存好像每次都爆掉,产生数的generator函数每次都返回false,所以现改为直接对generate数组的大小取余。。。

转载于:https://www.cnblogs.com/FZU2015SOFTWARE/p/7533248.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值