【问题标题】:Generating a Sudoku Board in C用 C 语言生成数独板
【发布时间】:2014-11-25 16:31:08
【问题描述】:

大家好,我有一个 C 类作业,我需要一些关于其中一项功能的帮助。

例如,

void genSudokuBoard(int grid[ ], int display[ ])

此函数使用 81 个元素的 'grid' 数组(包含一个完全 有效数独值的完整列表)并随机复制 4 个数字 从每个 3x3 块到 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[] 数组中的相应位置?

【问题讨论】:

    标签: c arrays sudoku


    【解决方案1】:

    由于这是作业,我会给你一点提示,而不是解决方案。

    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 个不同的索引 00 1 4 5,你就会得到0 1 10 11。然后继续复制display[i] = grid[i],其中i0 1 10 11

    当然还有其他方法。

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

    【讨论】:

      【解决方案2】:

      首先,我建议使用二维数组(考虑到数独板是二维的),并使用嵌套循环来填充这些板。 此外,您需要使用范围 (0-2)、(3-5) 和 (6-8) 作为指导,以确定哪些块构成哪些区域。这里,每个块是一个 3x3 区域,每个区域中是 x 和 y 的索引集(假设原点是左上角)。

      只需在这些地区随机选择数字即可。算法应该不会太复杂

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2023-02-10
        • 2013-04-21
        • 1970-01-01
        • 2021-12-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多