[英]Generating a Sudoku Board in C
嗨,大家好,我为C类分配了一个作业,我需要其中一个功能的帮助。
例如,
void genSudokuBoard(int grid[ ], int display[ ])
此函数使用81元素“网格”数组(包含有效数独值的完整列表),并将每个3x3块中的4个数字随机复制到81元素“显示”数组中的相应位置。 所选择的随机数将取决于数组位置(索引),因此,例如,假设左上方的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 []数组中的相应位置?
由于这是一项家庭作业,因此我将给您一些提示,而不是解决方案。
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 <= r <9。 您只能从4个生成的索引中提取该集合。 因此,如果生成0 1 4 5
,则取0 1 10 11
。 然后,继续复制display[i] = grid[i]
,其中i
为0 1 10 11
。
当然,还有其他方法。
我的建议是自下而上解决这个问题。 一旦确定了算法(就像我给你的算法一样),就应该尝试解决一些小问题。 例如,您首先应该弄清楚如何生成构成网格的9个索引。 与此无关,您应该弄清楚如何在一个间隔中生成k个不同的数字。 您可以在封闭的单元中完成所有这些操作,而完全忽略了其余的问题。 然后,您可以将这些合并到您的最终问题中。
首先,我建议使用二维数组(考虑数独板是二维的),然后使用嵌套循环填充这些板。 同样,您将需要使用范围(0-2),(3-5)和(6-8)作为指导,哪些块组成哪些区域。 在此,每个块是一个3x3区域,并且在每个区域中是x和y的索引集(假设原点是左上角)。
只需在这些区域中随机选择数字即可。 该算法不应该太棘手
附录:display []不是函数; 这是一个数组
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.