我在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
答案 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 ] )