python - 我需要在此数独 python 代码中进行解释

标签 python algorithm sudoku

<分区>

我尝试了这个用 Python 编写的数独解算器 https://freepythontips.wordpress.com/2013/09/01/sudoku-solver-in-python/ 代码运行良好。这是完整的代码:

import sys

def same_row(i,j): return (i/9 == j/9)
def same_col(i,j): return (i-j) % 9 == 0
def same_block(i,j): return (i/27 == j/27 and i%9/3 == j%9/3)

def r(a):
  i = a.find('0')
  if i == -1:
    sys.exit(a)

  excluded_numbers = set()
  for j in range(81):
    if same_row(i,j) or same_col(i,j) or same_block(i,j):
        excluded_numbers.add(a[j])

  for m in '123456789':
    if m not in excluded_numbers:
        r(a[:i]+m+a[i+1:])

r('100070030830600000002900608600004907090000050307500004203009100000002043040080009')

我不明白这个循环:

for m in '123456789':
        if m not in excluded_numbers:
            r(a[:i]+m+a[i+1:])

请有人解释这段代码的算法。谢谢

编辑: 我问的是那个循环的逻辑,现在我明白了逻辑,我检查了 Peter Novig 的数独解算器。

最佳答案

在代码的开头,您将 i 设置为第一个尚未填充的字段的索引。接下来,您将 excluded_numbers 设为该位置不允许出现的所有数字的集合,因为它们已经出现在与 i 相同的行、列或 block 中。

在您询问的for 循环中,您遍历所有可能的数字,猜测位置i 的数字是m。您首先检查 m 是否不是禁止数字之一,如果不是,则再次递归调用函数 r 并用猜测的 m< 替换空白点。这是通过将所有字段连接到位置 i (a[:i])、猜测的 m 以及之后的所有字段来完成的位置 i (a[i+1:])。获取位置i前后的部分由slicing完成放入代表整个棋盘的长字符串中。

函数 r() 作为一个整体通过找到第一个未填充的位置、用有效数字填充它然后再次递归调用自身来工作。如果在某个时候,某个位置没有更多的数字可以填充(因为你猜错了),函数就会退出。当函数最终找到一个完整的解决方案(没有 0 剩余)时,它打印解决方案并退出。请注意,这不是解决数独的非常有效的方法。一个更好的算法是 explained by Peter Norvig ,谷歌研究主管。

关于python - 我需要在此数独 python 代码中进行解释,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26570481/

相关文章:

java - 对于在 Java 中并行应用 MD5 哈希到一组文件的行为变化是否有解释?

c++ - HSV (0 .. 255) 到 RGB (0 .. 255)

php - 数独算法解释公式

python - 如何在 Web 服务器中设置 Python?

python - 在其他函数中声明的变量在主 python 3 中不起作用?

Python salt 栈 : How can I manage a file which is in a git repo?

python - 这个 for 循环是如何工作的?

r - 如何评估无监督算法的效率? pam 算法如何工作?

java - 比较 block 中的整数 Sudoku Java

java - 卡在数独回溯求解器中(Java)