【问题标题】:sudoku algorithm explanation formula数独算法解释公式
【发布时间】:2014-12-25 07:04:42
【问题描述】:

我正在使用人性化算法实现数独求解器。其中有 3 个约束,不同编号的 ini 行、单元格和框。

我用谷歌搜索得到http://www.emanueleferonato.com/2008/12/09/sudoku-creatorsolver-with-php/。但我不明白这家伙是如何获得floor($cell / 9) 的return_row 函数或floor(return_row($cell) / 3) * 3 + floor(return_col($cell) / 3) 的return_block。

我试图通过在 excel 中写下数据来弄清楚,我知道有一些这样的模式:

[cell] [column]
0      0
1      1
2      2
3      3
4      4
5      5
6      6
7      7
8      8
9      0

但是他是怎么知道公式是$cell % 9的呢?

我想知道,如果我不知道公式的答案,我该如何计算?我怎样才能确定那个公式?我应该使用什么方法?

谢谢

【问题讨论】:

标签: php algorithm math formula sudoku


【解决方案1】:

这来自单元格的计数方式,我们可以称之为行优先。

您可以在此图像上看到块和单元格编号及其各自的行号和列号:

行和列

第一行 (0) 包含单元格 0 到 8,第二行包含单元格 9 到 17,依此类推,直到第 8 行包含单元格 72 到 80。

如果您也对第 0 到 8 行和第 0 到 8 列进行编号,我们可以看到与此编号对应的单元格的公式是 cell = 9 * row + col,这应该解释了 get_row 和 get_col 的公式。

当从任何单元格向右移动一列时,单元格计数加 1,这意味着单元格编号的公式类似于 something + col

向下移动一行时,将每行的单元格数量添加到单元格编号中,此处为 9,因此公式也类似于 9 * row + something

将它们放在一起,您会得到一个公式 9 * row + col + offset :“+ 某物”的依赖关系是确定的 row 和 col,但也许它们仍然包含一个常量值。 在我们的例子中,公式给出了我们想要的编号,偏移量 = 0,但如果您从 1 开始编号,您的公式将是 9 * row + col + 1

但是,您不必每次都进行此推理。刚才,当您有一个矩形来逐行计算项目时,项目编号的公式是always row * row_size + col + number at (0,0)。这也是 C 中为双精度数组分配连续内存的方式,例如,一种非常常见的模式。如果你逐列计算,那么你有col * col_size + row + number at (0,0)

现在块的编号方式相同,但只有 3 行和列。可以将get_block公式中的元素一一替换来理解:floor(row / 3) * 3 + floor(col / 3)

由于有 3 行块但 9 个单元格,(单元格-)行 0、1 和 2 对应于第一行块,3 到 5 对应于第二行块,6 到 8 对应于最后一行和第三排积木。我们从中得到的是一行块rb 包含行单元格3 * rb3 * rb +13 * rb + 2。相反的操作是除以 3 和下限,对于上面的任何表达式,您都可以得到 rb

这对列的工作方式完全相同。

因此,在表达式中替换时,我们现在有:block_row * 3 + block_col。这与我们用于单元格编号的公式完全相同(用 3 而不是 9),因此可以从其行和列中获取块的编号。

【讨论】:

  • 感谢您的回答。好的,现在我了解了块功能。但我仍然对 get_row 和 get_cell 感到困惑。是否只是通过猜测来制作功能?或者有一些数学方法可以解决这种模式(表格)?
  • 你能解释一下 is_possible_block 函数吗?与stackoverflow.com/questions/16872773/… 类似,但我仍然感到困惑。
  • @john 这与这个问题的内容完全不同:它检查一个数字是否尚未写入行、列或块中。尝试将其写在纸上并进行查找,如果您仍然不明白并且之前没有在 SO 上询问过,您可以提出一个新的问题。
  • 好的,谢谢。我在这里发布了一个新问题:stackoverflow.com/questions/27685094/…
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-05-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多