Python 中的数独检查器

新手上路,请多包涵

我正在尝试在 python 中创建一个数独检查器:

 ill_formed = [[5,3,4,6,7,8,9,1,2],
              [6,7,2,1,9,5,3,4,8],
              [1,9,8,3,4,2,5,6,7],
              [8,5,9,7,6,1,4,2,3],
              [4,2,6,8,5,3,7,9],  # <---
              [7,1,3,9,2,4,8,5,6],
              [9,6,1,5,3,7,2,8,4],
              [2,8,7,4,1,9,6,3,5],
              [3,4,5,2,8,6,1,7,9]]
easy = [[2,9,0,0,0,0,0,7,0],
       [3,0,6,0,0,8,4,0,0],
       [8,0,0,0,4,0,0,0,2],
       [0,2,0,0,3,1,0,0,7],
       [0,0,0,0,8,0,0,0,0],
       [1,0,0,9,5,0,0,6,0],
       [7,0,0,0,9,0,0,0,1],
       [0,0,1,2,0,0,3,0,6],
       [0,3,0,0,0,0,0,5,9]]

我期待这样的输入——一个包含 9 个列表的列表。零表示用户尚未填写的数字。它们可以在一行、一列或 3x3 中出现多次。

 def check_sudoku(grid):
if len(grid) == 9:
    numsinrow = 0
    for i in range(9):
        if len(grid[i]) == 9:
            numsinrow += 1
    if numsinrow == 9:
        for i in range(9):
            rowoccurence = [0,0,0,0,0,0,0,0,0,0]
            for j in range(9):
                rowoccurence[grid[i][j]] += 1
                temprow = rowoccurence[1:10]
                if temprow == [1,1,1,1,1,1,1,1,1]:
                    return True
                else:
                    return False
    else:
        return False
else:
    return False

我显然需要检查是否有一个 9x9 的列表列表(网格),并且每行、每列和 3x3 的小方块中没有重复项。在代码中,我首先检查行数是否合适(应该是 9)。然后我检查每一行中是否有 9 个元素(在 ill_formed 示例中,您会发现情况并非如此)。然后我尝试检查每一行中的重复项,但我在这样做时遇到了一些麻烦。我认为我可以遍历每一行并遍历该行中的每个元素,然后将 1 添加到整数列表(rowoccurence)。例如,如果第一个数字是 2,那么 rowoccurence[2] 应该等于 1。零在 rowoccurence[0] 中并且没有被检查(我有一个临时列表,它应该包含除第一个元素之外的所有元素 -零-因为一行中可能有超过 1 个零,并且网格仍然是合法的)。我尝试根据正确值的参考列表检查临时列表(基本上是 rowoccurence),但它似乎不起作用。你能帮我检查这个数独检查器中的重复行吗?非常感谢您!

原文由 quagpwn 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 322
1 个回答

请记住,您不是在搜索重复项——只是非零重复项。总结一组适用于此。还可以同时检查行/列的合法性:

 def sudoku_ok(line):
    return (len(line) == 9 and sum(line) == sum(set(line)))

def check_sudoku(grid):
    bad_rows = [row for row in grid if not sudoku_ok(row)]
    grid = list(zip(*grid))
    bad_cols = [col for col in grid if not sudoku_ok(col)]
    squares = []
    for i in range(9, step=3):
        for j in range(9, step=3):
          square = list(itertools.chain(row[j:j+3] for row in grid[i:i+3]))
          squares.append(square)
    bad_squares = [square for square in squares if not sudoku_ok(square)]
    return not (bad_rows or bad_cols or bad_squares)

原文由 llb 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
logo
Stack Overflow 翻译
子站问答
访问
宣传栏