首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >Python中最短的数独解算器-它是如何工作的?

Python中最短的数独解算器-它是如何工作的?
EN

Stack Overflow用户
提问于 2008-10-14 14:46:16
回答 4查看 79.6K关注 0票数 82

我正在玩我自己的数独解算器,正在寻找一些好的和快速的设计的指针,这时我遇到了这个:

代码语言:javascript
复制
def r(a):i=a.find('0');~i or exit(a);[m
in[(i-j)%9*(i/9^j/9)*(i/27^j/27|i%9/3^j%9/3)or a[j]for
j in range(81)]or r(a[:i]+m+a[i+1:])for m in'%d'%5**18]
from sys import*;r(argv[1])

我自己的实现解决Sudokus的方式与我在头脑中解决它们的方式相同,但是这个神秘的算法是如何工作的呢?

http://scottkirkwood.blogspot.com/2006/07/shortest-sudoku-solver-in-python.html

EN

回答 4

Stack Overflow用户

发布于 2008-10-14 15:05:38

对其进行模糊处理:

代码语言:javascript
复制
def r(a):
    i = a.find('0') # returns -1 on fail, index otherwise
    ~i or exit(a) # ~(-1) == 0, anthing else is not 0
                  # thus: if i == -1: exit(a)
    inner_lexp = [ (i-j)%9*(i/9 ^ j/9)*(i/27 ^ j/27 | i%9/3 ^ j%9/3) or a[j] 
                   for j in range(81)]  # r appears to be a string of 81 
                                        # characters with 0 for empty and 1-9 
                                        # otherwise
    [m in inner_lexp or r(a[:i]+m+a[i+1:]) for m in'%d'%5**18] # recurse
                            # trying all possible digits for that empty field
                            # if m is not in the inner lexp

from sys import *
r(argv[1]) # thus, a is some string

因此,我们只需要计算出内部列表表达式。我知道它收集行中设置的数字--否则,它周围的代码就没有意义了。然而,我真的不知道它是如何做到的(我现在太累了,搞不懂这种二进制的幻想,抱歉)

票数 10
EN

Stack Overflow用户

发布于 2008-10-14 15:07:21

r(a)是一个递归函数,它尝试在每一步中填充电路板中的一个0

i=a.find('0');~i or exit(a)是成功时的终止。如果板中不存在更多的0值,我们就结束了。

m是我们将尝试用来填充0的当前值。

如果将m放在当前0中显然是不正确的,则m in[(i-j)%9*(i/9^j/9)*(i/27^j/27|i%9/3^j%9/3)or a[j]for j in range(81)]的计算结果为truthy。让我们将其昵称为"is_bad“。这是最棘手的一点。:)

is_bad or r(a[:i]+m+a[i+1:]是一个条件递归步骤。它将递归地尝试评估董事会中的下一个0,如果当前的解决方案候选似乎是合理的。

for m in '%d'%5**18枚举从1到9的所有数字(效率低下)。

票数 7
EN

Stack Overflow用户

发布于 2008-10-14 14:54:15

许多短数独解算器只是递归地尝试剩余的每个可能的合法数字,直到它们成功填充单元格为止。我还没有把它拆开,只是略看一下,看起来它就是这么做的。

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/201461

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档