【问题标题】:How do I generate 2d array with distinct number between row and column?如何在行和列之间生成具有不同数字的二维数组?
【发布时间】:2017-12-17 09:35:40
【问题描述】:
    void generateSudoku(int sudoku[][C])
            {
                for (int i = 0; i < R; i++)
                {
                    for (int j = 0; j < C; j++)
                    {
                        sudoku[i][j] = generateRandNum(); //generate random number for all 2d array
                        while (sudoku[1][0] == sudoku[0][0] || sudoku[2][0] == sudoku[1][0] || sudoku[2][0] == sudoku[0][0]
                            || sudoku[3][0] == sudoku[2][0] || sudoku[3][0] == sudoku[1][0] || sudoku[3][0] == sudoku[0][0])
                            sudoku[i][j] = generateRandNum();
                        while (   sudoku[i][1] == sudoku[i][0] || sudoku[1][1] == sudoku[0][1] || sudoku[2][1] == sudoku[1][1]
                               || sudoku[2][1] == sudoku[0][1] || sudoku[3][1] == sudoku[2][1] || sudoku[3][1] == sudoku[1][1]
                               || sudoku[3][1] == sudoku[0][1]) //index 1 to index 0
                            sudoku[i][j] = generateRandNum();
                        while ( (sudoku[i][2] == sudoku[i][0]) || (sudoku[i][2] == sudoku[i][1]) || sudoku[1][2] == sudoku[0][2]
                               || sudoku[2][2] == sudoku[1][2] || sudoku[2][2] == sudoku[0][2] || sudoku[3][2] == sudoku[2][2]
                               || sudoku[3][2] == sudoku[1][2] || sudoku[3][2] == sudoku[0][2])
                            sudoku[i][j] = generateRandNum();
                        while ( (sudoku[i][3] == sudoku[i][0]) || (sudoku[i][3] == sudoku[i][1]) || (sudoku[i][3] == sudoku[i][2])) //index 3 to index 2,1,0
                            sudoku[i][j] = generateRandNum();
                    }

                }
            }

是否有更有效和更简单的方法来生成具有随机数的二维数组,这些随机数在每一列和每一行中都是不同的,就像数独一样?代码可以运行,但是执行时间太长,可能是循环太多造成的。另外我是初学者(一年级的 CS 学生),所以这是我能想到的让它与众不同的唯一方法(是的,我知道它愚蠢、低效和错误),因为我不知道如何做复杂的算法。

编辑:generateRandNum:

int generateRandNum()
{
    int randNum;
    randNum = (rand() % 4)+1;
    return randNum;
}

【问题讨论】:

  • 你能发布 generateRandNum 的正文吗?
  • 发表在主帖
  • genRandNum 中的 for 循环是浪费时间,你为什么有它?该函数只返回一个数字,而不是全部 20
  • 是的,你是对的,我忘了删除它
  • 只检查第 i 行、第 j 列和第 i 行、第 j 列以及在一个条件下的所有内容,当您为 i、j 生成数字时,没有理由检查其他任何内容

标签: c++ arrays random distinct sudoku


【解决方案1】:

我不知道这是否有帮助,但我在另一个thread 中找到了一个简单的算法来生成一个完整的数独谜题。有关更多详细信息,请查看此线程。这是我对该算法的简短实现:

std::array <unsigned int, 9> seed = {8, 9, 3, 2, 7, 6, 4, 5, 1};

std::array <std::array <unsigned int, 9>, 9> generate(std::array
    <unsigned int, 9> seed)
{
    unsigned int seedOffset {0};
    std::array <std::array <unsigned int, 9>, 9> field;

    field.at(0) = seed;

    for(unsigned int fieldIndex {1}; fieldIndex < field.size(); ++fieldIndex)
    {
        seedOffset = (0 == (fieldIndex % 3)) ? 1 : 3;
        std::rotate(seed.begin(), seed.begin() + seedOffset, seed.end());
        field.at(fieldIndex) = seed;
    }

    return field;
}

【讨论】:

    猜你喜欢
    • 2014-04-28
    • 2021-10-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多