用C生成数独板

时间:2014-11-25 16:31:08

标签: c arrays sudoku

大家好,我有一个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 []数组中的相应位置?

2 个答案:

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

当然还有其他方法。

我的建议是自下而上解决这个问题。这是一旦你确定算法(就像我给你的那个),你应该尝试解决这些小问题。例如,您应该首先弄清楚如何生成构成网格的9个索引。独立于此,您应该弄清楚如何在一个区间中生成k个不同的数字。你用所包含的单位做所有这些,完全忽略了问题的其余部分。然后你可以把它们合并到你最后的问题中。

答案 1 :(得分:0)

首先,我建议使用二维数组(考虑到数独板是二维的),并使用嵌套循环来填充这些板。 此外,您还需要使用范围(0-2),(3-5)和(6-8)作为哪些块构成哪些区域的指南。这里,每个块是3×3区域,并且在每个区域中是x和y的索引集合(假设原点是左上角)。 This image shows which regions are which

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

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