我继续我的数独,但我需要你的帮助。我被封锁了:
def grid_index(grid, value):
for i, row in enumerate(grid):
for j, cell in enumerate(row):
if cell == value:
return i, j
return -1, -1
def can_fill_cell(sudoku, coords):
row = sudoku[0]
for cell in row:
if cell == value_to_input:
return False
column = [row[0] for row in sudoku]
for cell in column:
if cell == value_to_input:
return False
square = [sudoku[x][y] for x in range(3) for y in range(3)]
for cell in square:
if cell == value_to_input:
return False
return True
def solve_next_unsolved(sudoku):
"""
for x in range(9):
for y in range(9):
coords = x,y
"""
coords = (2,2)
if can_fill_cell(sudoku, coords):
sudoku[coords[0]][coords[1]] = value_to_input
print(sudoku)
因此,在grid_index中,我得到所有的单元格坐标。
在我的can_fill_cell函数中,我说:"如果一个值等于要输入的值,则打破for并退出函数返回False并且不输入值"
我现在遇到的问题是,我不知道如何验证所有行,列和区域...
你有什么想法吗?
THX, Ravaniss
编辑:只是为了获取信息,我得到了这样的数独:
value_to_input = "1"
def import_sudoku():
with open("sudoku.txt") as f:
lines = f.read()
sudoku = [[character for character in line if not character == " "] for line in lines.split("\n")]
return sudoku
sudoku = import_sudoku()
print(sudoku)
Si,现在我可以验证:
.2.
.2.
...
不打印结果,所以它是假的,但我可以这样做:
...
1..
...
.2.
22.
...
例如,。我需要验证什么。我如何验证所有这些并使我的数独工作?
谢谢你的帮助!
答案 0 :(得分:0)
所以听起来你的数独是列表,例如
[ [1, 2, 3, 4, 5, 6, 7, 8, 9],
[4, 5, 6, 7, 8, 9, 1, 2, 3],
[7, 8, 9, 1, 2, 3, 4, 5, 6],
... ]
您需要单独验证行和列,但这些很容易。
for row in sudoku:
verify(row)
for col in zip(*sudoku):
verify(col)
# zip(*iterable) is a very useful idiom for flipping rows to columns
更难的是3x3s。由于这是一个已知数量(9x9数独),因此可能更容易枚举它而不是自己计算它。
grids = [ [s[0][0], s[0][1], s[0][2],
s[1][0], s[1][1], s[1][2],
s[2][0], s[2][1], s[2][2]],
... ]
虽然这肯定是耗时的,但它也很简单直接。您可以使用itertools.product
来简化此操作:
grids = [ [s[y][x] for x, y in itertools.product(range(i, i+3), repeat=2)]
for i in range(1, 8, 3) ]
无论哪种方式,您都需要检查一组新数字。
for grid in grids:
verify(grid)
在这种情况下, verify
可能最容易通过检查重复项来实现
def verify(group):
return len(group) == len(set(group))
如果您愿意,可以根据文字对其进行验证
def verify(group):
return sorted(group) == [1,2,3,4,5,6,7,8,9]