(Python)在数独中检查3x3,有更好的方法吗?

时间:2014-06-03 13:56:20

标签: python sudoku

我在HS总结中的合作伙伴给了我这个算法,我希望有人能告诉我是否有更有说服力的编码方法。 CB是当前的董事会职位(全球),它是一份清单。

for a in xrange(0, 3): 
  for b in xrange(0, 3):
    for j in xrange(1, 4): 
      for k in xrange(1, 4): 
        boxsum += CB[3a + j][3b + k] 
        if not(boxsum == 45):        
          return False               
        boxsum = 0

4 个答案:

答案 0 :(得分:1)

首先,以下代码未正确缩进:

if not(boxsum == 45):        
    return False               
boxsum = 0

(使用当前缩进,它将在第一次执行此代码时始终失败)

其次,在以下行中:

boxsum += CB[3a + j][3b + k] 
你可能打算这样做:

boxsum += CB[3*a + j][3*b + k] 

最后,为了检查数独游戏的3x3部分,仅检查sum是不够的 - 你还应该检查1-9之间的每个数字是否存在(换句话说,所有数字都是数字在1-9范围内,并且没有数字出现多次。)

答案 1 :(得分:0)

有许多“更清洁”的方法。

首先,为什么不将numpy用于矩阵,你明显使用矩阵?我假设你的数字(这有点奇怪,为什么你从“1”开始计算?)

import numpy as np
CB = np.array(CB)

def constraint3x3check(CB):
    return np.all(np.sum( CB[3*a+1:3*a+3, 3*b+1:3*b+3)==45 for a in range(3) for b in range(3))

答案 2 :(得分:0)

如果方框的总和等于45,那并不意味着存在1-9个数字。

例如,您可以添加您的数字进行设置,并检查该组的长度是否始终为9。

答案 3 :(得分:0)

由于总和45并不意味着答案是正确的,因此需要采用不同的方式。就个人而言,我会将这些行连接到一个列表中并将它们与列表(1,2,... 9)进行比较,例如

#assuming this is your format...
box = [[4,2,3],[1,5,9],[8,7,6]]

def valid_box(box):
    check_list = []
    for row in box:
        check_list += row
    return list(range(1,10)) == sorted(check_list)

虽然创建列表的代码也可以通过列表理解来完成(我不知道哪一个更有效,但是处理器方式)

def valid_box2(box):
    return list(range(1,10)) == sorted( [item for row in box for item in row ] )

合并列表代码取自Making a flat list out of list of lists in Python