所以,我正在尝试创建一个函数,它将包含一个列表列表,每个列表包含9个编号为1到9的整数,如果它是数独的有效解,则返回一个布尔值。现在,我已经设法通过检查行和列来解决部分问题,但我坚持执行检查三到三个框。到目前为止,这是我的代码。
alist = [1,2,3,4,5,6,7,8,9]
def checkSudoku(grid):
a = grid
b = grid
c = grid
d = False
e = False
f = False
newlist = []
for i in a:
i.sort()
if i == alist:
d = True
else:
d = False
break
for j in range(9):
for k in b:
newlist.append(k)
newlist.sort()
if i == alist:
e = True
newlist = []
else:
e = False
break
if d == True and e == True:
return True
else:
return False
基本上,我要测试所有必要的三个因素才真实,然后如果所有三个都是True则返回True,否则返回false。有什么帮助吗?
答案 0 :(得分:1)
不确定这是否是您的问题,但此代码存在一个非常明显的问题:
a = grid
b = grid
c = grid
看起来你认为这会创建3个网格副本,但事实并非如此。它为同一个对象创建三个不同的引用。这意味着i.sort()
上的a
将影响b
之后的逻辑。
您应该做的是实际复制对象。这是一个嵌套列表使这有点棘手,但一个简单的方法是使用库函数deepcopy:
a = copy.deepcopy(grid)
b = copy.deepcopy(grid)
c = copy.deepcopy(grid)
答案 1 :(得分:1)
代码工作方式的一个主要问题是您使用的是list.sort
,这意味着网格本身会发生变化。考虑使用sorted
,它适用于所有迭代,并返回一个副本:
for row in grid:
if sorted(row) == alist:
# now you know that the row contains all ints 1-9.
这也意味着您无需尝试手动复制grid
。如果您需要帮助重复list
(特别是多维list
),请查看this question。
至于检查每个3x3盒子:首先迭代9个“左上角”的每个角落:
for x in (0,3,6):
for y in (0,3,6):
subgrid = grid[y][x:x+3] + grid[y+1][x:x+3] + grid[y+2][x:x+3]
if sorted(subgrid) == alist:
# do your thing
有关列表切片的帮助,请检查this out。