大家好,我有一个C类的作业,我需要一些函数的帮助。
例如,
void genSudokuBoard(int grid[ ], int display[ ])
此函数使用81元素'grid'数组(包含一个完整的 已完成的有效数独值列表)并随机复制4个数字 从每个3x3块进入81中的相应位置 元素'display'数组。选择的随机数将是数组 位置(索引),例如,假设左上方的3x3块包含 数组索引: 整个3x3块:0,1,2,9,10,11,18,19,20 4个随机索引可能是:2,10,11,19
到目前为止,我有这个,
void genSudokuBoard(int grid[], int display[])
{
int i;
for (i = 0; i < 81; i++){
display[i] = grid[rand() % 9 + 1];
}
}
基本上我的问题是,如何将每个3x3块中的4个随机数复制到display []数组中的相应位置?
答案 0 :(得分:2)
由于这是一个家庭作业,我会给你一点提示,而不是解决方案。
display[i] = grid[rand() % 9 + 1];
这里你从随机网格索引复制到display[i]
。这绝对不是你想要的。复制时需要复制到同一索引。即。
display[i] = grid[i];
您只需选择要复制的i
而不是。
您需要从9个数字中生成4个随机数。例如,在您的示例中,您必须确定构成网格的9个索引:0, 1, 2, 9, 10, 11, 18, 19, 20
。这是一组9个值,因此您可以生成4个不同的索引0&lt; = r&lt; 9。您仅从4个生成的索引中获取此集合。因此,如果您生成0 1 4 5
,则需要0 1 10 11
。然后,您继续复制display[i] = grid[i]
,其中i
为0 1 10 11
。
当然还有其他方法。
我的建议是自下而上解决这个问题。这是一旦你确定算法(就像我给你的那个),你应该尝试解决这些小问题。例如,您应该首先弄清楚如何生成构成网格的9个索引。独立于此,您应该弄清楚如何在一个区间中生成k个不同的数字。你用所包含的单位做所有这些,完全忽略了问题的其余部分。然后你可以把它们合并到你最后的问题中。
答案 1 :(得分:0)
首先,我建议使用二维数组(考虑到数独板是二维的),并使用嵌套循环来填充这些板。 此外,您还需要使用范围(0-2),(3-5)和(6-8)作为哪些块构成哪些区域的指南。这里,每个块是3×3区域,并且在每个区域中是x和y的索引集合(假设原点是左上角)。
只需随机选择这些地区的数字即可。该算法不应该太棘手
ADDENDUM:display []不是函数;这是一个数组