数独检查术语

4

我需要检查用户输入的数字是否已经在列、行或“块”中(最后一部分还在开发中)。

但是出于某种原因,这些检查不起作用,我不知道为什么?

我在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

有没有办法检查数字是否已经在框中?

谢谢!


1
什么不起作用?我看到你的for循环永远不会执行。 - Rohit Jain
Python打印True,我猜这是对其他东西进行先前检查的结果。无论如何,它只是打印“True”。 - user1816377
请不要将代码更改为固定代码,因为这基本上会使答案无用(因为它们是针对原始代码的)。 - poke
2个回答

5
问题在于,只要找到任何一个不失败的检查,你就会返回 true。所以如果你有一个有效的行,你的检查已经成功了,尽管该列可能已经充满了相同的数字。
因此,基本上,删除所有的“return True”行,并在所有检查结束后放置一个单独的“True”。
还有一些需要注意的地方:
- 在返回值中不要给 True 或 False 加括号。 - 不需要在 return 后加 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

它有所帮助,但只适用于第一个术语。 现在第二个术语出错了。 “如果数字在board [i] [row]中: TypeError:类型为'int'的参数不可迭代” - user1816377
board[i][row] 是一个单独的数字,因此您不能检查 digit in single_numer,而需要检查相等性:digit == board[i][row] - poke
1
我认为 blockRow = row 应该改为 blockRow = row - (row % 3)blockColumn 同理。 - Mohamed AMAZIRH
@MohamedA。语法高亮显示器显示不正确,// 3 * 3 部分是其中的一部分。这是一个整数除法,然后乘以 3。基本上与您的代码使用模运算符相同。 - poke
好的,抱歉,我忘记了这是Python代码,认为// 3*3是一条注释 :) - Mohamed AMAZIRH
好的,我终于成功让这个高亮显示器正确地显示了... - poke

0
如果您想为用户创建数独,请遵循以下提示:删除数字的方法是镜像模式(抱歉我的英语不好)。例如:

(1 _ 3 4)

        (7 _ 5 6) 

我正在寻找解决方案,如何检查数字是否已经在盒子里了。 - user1816377

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接