我正在尝试编写解决数独难题的python代码。我的代码从列出每个行/列组合或每个框的坐标开始。接下来,我想为每种包装盒找到一种参考其位置的方法。这是我当前的代码:
boxes = []
for i in range(1, 10):
for x in range(1,10):
boxes = boxes + ['r'+str(i)+'c'+str(x)]
for box in boxes:
接下来,我将为每个字典创建一个字典,但是我希望每个字典都由列表项命名。字典将是,例如,r1c1 = {'行':'1','列':1}。
分离和存储此信息的最佳方法是什么?
您无需创建所有这些字典。您已经有了坐标,只是不要将它们锁定在字符串中:
boxes = []
for i in range(1, 10):
for x in range(1,10):
boxes.append((i, x))
(row, column)
而是创建一个元组列表,然后您不必将它们映射回去。
即使您需要将字符串与数据相关联,也可以在嵌套字典中这样做:
coordinates = {
'r1c1': {'row': 1, 'column': 1},
# ...
}
但您也可以解析该字符串并提取之后的数字,r
然后c
再次产生行和列的数字。
实际上,我曾经根据相同的原理编写过Sudoku检查器。在下面的代码中block_indices
,per9()
并zip(*per9(s))
为拼图的每个块,行或列生成索引,让您验证每个块中有9个唯一值。唯一的区别是,我使用一个长长的列表代替一个矩阵,而不是一个矩阵,所有元素逐行包括在顺序中:
from itertools import product
block_indices = [[x + y + s for s in (0, 1, 2, 9, 10, 11, 18, 19, 20)]
for x, y in product(range(0, 81, 27), range(0, 9, 3))]
def per9(iterable):
# group iterable in chunks of 9
return zip(*([iter(iterable)] * 9))
def is_valid_sudoku(s):
return (
# rows
all(len(set(r)) == 9 for r in per9(s)) and
# columns
all(len(set(c)) == 9 for c in zip(*per9(s))) and
# blocks
all(len(set(s[i] for i in ix)) == 9 for ix in block_indices)
)
因此,第1行第4列为平面列表中的1 * 9 + 4 =索引13。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句