繁体   English   中英

用C生成数独板

[英]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] ,其中i0 1 10 11

当然,还有其他方法。

我的建议是自下而上解决这个问题。 一旦确定了算法(就像我给你的算法一样),就应该尝试解决一些小问题。 例如,您首先应该弄清楚如何生成构成网格的9个索引。 与此无关,您应该弄清楚如何在一个间隔中生成k个不同的数字。 您可以在封闭的单元中完成所有这些操作,而完全忽略了其余的问题。 然后,您可以将这些合并到您的最终问题中。

首先,我建议使用二维数组(考虑数独板是二维的),然后使用嵌套循环填充这些板。 同样,您将需要使用范围(0-2),(3-5)和(6-8)作为指导,哪些块组成哪些区域。 在此,每个块是一个3x3区域,并且在每个区域中是x和y的索引集(假设原点是左上角)。 此图显示了哪些区域

只需在这些区域中随机选择数字即可。 该算法不应该太棘手

附录:display []不是函数; 这是一个数组

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM