如何检查Sudoku Python中的每一行/列/区域

时间:2016-04-26 21:50:06

标签: python python-3.x

我继续我的数独,但我需要你的帮助。我被封锁了:

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.
...
例如,

。我需要验证什么。我如何验证所有这些并使我的数独工作?

谢谢你的帮助!

1 个答案:

答案 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]