所以我想解决一个问题,这个问题让你比较9x9数独网格中的数字,看看数独游戏是否有一个有效的/可解的数字网格(这意味着数独规则适用于给定的网格)。我基本上解决了这个问题,但最后一部分我还没搞定。我已经知道如何对每一列/每行上的每个元素求和,但我无法完全解决这个问题,直到我能够真正检查每个3x3网格,看看其中是否有重复的数字。这就是我陷入困境的地方,因为我似乎无法得到正确的算法来以3x3的方式迭代矩阵。在
我试图通过使用一系列for循环来完全控制迭代,这些循环增加了特定的索引数,使其沿着矩阵移动。告诉我我做错了什么——或者是否有其他可能的、更优雅的方法来解决这个问题(使用如此多的for循环会使我的代码看起来又长又丑/效率低下)。在
def sudoku(grid):
grid = [[1,3,2,5,4,6,9,8,7],
[4,6,5,8,7,9,3,2,1],
[7,9,8,2,1,3,6,5,4],
[9,2,1,4,3,5,8,7,6],
[3,5,4,7,6,8,2,1,9],
[6,8,7,1,9,2,5,4,3],
[5,7,6,9,8,1,4,3,2],
[2,4,3,6,5,7,1,9,8],
[8,1,9,3,2,4,7,6,5]]
duplicate = set()
numHolder = 0
for a in range(0,9):
for b in range(0,9):
numHolder+=grid[b][a]
if numHolder!=45:
return False
numHolder=0
for b in range(0,9):
for x in range(0, 9):
numHolder += grid[b][x]
if numHolder != 45:
return False
numHolder = 0
for b in range(0,3):
for c in range(0,3):
if grid[b][c] in duplicate:
return False
else:
duplicate.add(grid[b][c])
duplicate.clear()
for d in range(0,3):
for e in range(0,3):
if grid[d][c+3] in duplicate:
return False
else:
duplicate.add(grid[d][c+3])
duplicate.clear()
for d in range(0,3):
for e in range(0,3):
if grid[b][c+6] in duplicate:
return False
else:
duplicate.add(grid[d][c+6])
duplicate.clear()
for d in range(0,3):
for e in range(0,3):
if grid[d+3][c] in duplicate:
return False
else:
duplicate.add(grid[d+3][c])
duplicate.clear()
for d in range(0,3):
for e in range(0,3):
if grid[d+3][c+3] in duplicate:
return False
else:
duplicate.add(grid[d+3][c+3])
duplicate.clear()
for d in range(0,3):
for e in range(0,3):
if grid[d+3][c+6] in duplicate:
return False
else:
duplicate.add(grid[d+3][c+6])
duplicate.clear()
for d in range(0,3):
for e in range(0,3):
if grid[d+6][c] in duplicate:
return False
else:
duplicate.add(grid[d+6][c])
duplicate.clear()
for d in range(0,3):
for e in range(0,3):
if grid[d+6][c+3] in duplicate:
return False
else:
duplicate.add(grid[d+6][c+3])
duplicate.clear()
for d in range(0,3):
for e in range(0,3):
if grid[d+6][c+6] in duplicate:
return False
else:
duplicate.add(grid[d+6][c+6])
return True
如果您希望在纯python中检查数独的所有约束,最好将所有约束生成为可以总结的值列表:
要提取以行列表形式组织的网格的子矩阵,对一组水平范围和一组垂直范围进行嵌套迭代就足够了:
^{pr2}$这两组范围由函数
make_ranges
生成:它为每个方向调用
make_range
:为了保持算法的灵活性,网格参数被定义为变量:
通用范围集创建为:
从网格中提取相应的约束:
检查
^{8}$CONSTRAINT_SUM
:这允许详细的调试输出来验证算法的正确操作:
这表明:
您可以从您的9x9获得3x3的列表
然后你可以检查每个3x3是否包含数字1到9,例如
^{pr2}$也许你可以用更小的矩阵
然后您可以找到重复的值,如this question,例如
这很容易在NumPy中解决:
相关问题 更多 >
编程相关推荐