【问题标题】:Dividing a 9x9 2d array into 9 sub-grids (like in sudoku)? (C++)将 9x9 二维数组划分为 9 个子网格(如数独)? (C++)
【发布时间】:2011-01-17 21:41:07
【问题描述】:

我正在尝试编写一个数独求解器,我尝试这样做的方法是使用一个 9x9 的指针网格来保存具有解决方案或有效可能值的“集合”对象的地址。

我能够通过 2 个 for 循环遍历数组,首先遍历每一列,然后转到下一行并重复。

但是,我很难想象如何指定特定单元格属于哪个子网格(或框、块等)。我最初的印象是在 for 循环中有 if 语句,例如 if row

【问题讨论】:

  • 如果 (i,j) 是单元格的坐标,则 (i/3,j/3) 是块的坐标。
  • 对于数独求解器,您可能需要考虑一下速度,并使用预先计算的查找表。一个包含 81 项的数组来查找一个单元格所在的块将是快速而简单的。不是答案,因为您仍然需要生成该数组,但如果您有足够的耐心,您可以手动将其填充为静态数据块。
  • @Steve314 在考虑速度时,请更喜欢简单的计算而不是查找。完整的内存读取是昂贵的。只有当答案恰好在 L1 缓存中时,查找它的速度可能不会变慢(但它仍然会占用宝贵的 L1 缓存空间)。
  • @Sjoerd - 一个 81 字节的表并不十分庞大,并且考虑到整个算法很短,除了第一次调用之外,无论如何都应该在 L1 缓存中。但是,经过反思,您可能对简单的计算更小是正确的。

标签: c++ multidimensional-array sudoku


【解决方案1】:

您可以像这样从行和列计算块号:

int block = (row/3)*3 + (col/3);

这样对块进行编号:

+---+---+---+
| 0 | 1 | 2 |
+---+---+---+
| 3 | 4 | 5 |
+---+---+---+
| 6 | 7 | 8 |
+---+---+---+

【讨论】:

  • 我正要发布相同的答案。
【解决方案2】:

我将创建一个包含 81 个条目的查找表。每个条目都引用 9x9 网格中的一个单元格,并为您提供所需的信息(哪个框、哪一列、哪一行……)

【讨论】:

    【解决方案3】:

    我自己使用这个(但在 python 中,假设 x 和 y 从 0 到 9 互斥):

    int bx, by;
    for (bx = (x/3)*3; bx < (x/3)*3 + 3; bx++) {
        for (by = (y/3)*3; by < (y/3)*3 + 3; by++) {
            // bx and by will now loop over each number in the block which also contains x, y
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2012-03-10
      • 2013-04-27
      • 2018-05-03
      • 1970-01-01
      • 1970-01-01
      • 2013-01-08
      • 2020-11-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多