数独检查条款

时间:2012-11-11 17:31:31

标签: python sudoku

我需要检查用户插入的数字是否已经在列,行或“块”中(仍然在最后一部分工作)。 由于某种原因,这些检查不起作用,我不明白为什么? 我在shell中编写了相同的代码,它运行得很好。

我的代码:

def is_valid_move(board,row, column, digit):
    if digit in board[row]:
        print "Row already contains", digit
        return (False)
    else:
        return (True)

    for i in range(9):
        if digit in board[i][row]:
            print "Colum already contains", digit
            return (False)
            break
        else:
            return (True)

board = [[3,7,0,0,5,0,0,0,0],
         [0,6,0,0,3,0,2,0,0],
         [0,2,9,4,0,0,0,7,8],
         [0,0,4,1,7,0,0,8,0],
         [0,0,6,3,0,5,9,0,0],
         [0,5,0,0,8,4,1,0,0],
         [7,1,0,0,0,8,5,6,0],
         [0,0,5,0,1,0,0,2,0],
         [0,0,0,0,9,0,0,1,3]]

a=is_valid_move(board,1, 2, 9)
print a

输出我得到:

True

任何想法如何检查数字是否已经在框中?

谢谢!

2 个答案:

答案 0 :(得分:5)

问题是,一旦发现任何未失败的检查,您就会返回true。因此,如果您有一个有效的行,那么您的检查已经成功,尽管该列可能已填满相同的数字。

基本上,删除所有return True行,并在所有检查结束后在最后放一个。

还有一些事情:

  • 请勿在回复中添加TrueFalse括号。
  • break之后您不需要return,因为后者已经结束了此功能。
  • board[i][row]以单个数字进行评估,因此使用digit in进行检查将无效,因为它需要可迭代。
  • board[i][row]应为board[i][column],因为第一个列表索引已经是行。

要检查3x3组的第三个条件是否有效,首先需要确定一个单元格属于哪个“框”,然后检查内部的所有数字:

# get the first row/column index of a block
blockRow = row // 3 * 3
blockColumn = column // 3 * 3

# check all 8 fields in the block
for r in range(blockRow, blockRow + 3):
    for c in range(blockColumn, blockColumn + 3):
        # skip the field we want to check
        if r == row and c == column:
            continue

        if digit == board[r][c]:
            return False

答案 1 :(得分:0)

如果你想为用户创建一个数独游戏,请按照这个提示的方式在镜像模式中删除数字(对不起我的英语)示例

(1 _ 3 4)

        (7 _ 5 6)