4

ユーザーが挿入した番号がすでに列、行、または「ブロック」にあるかどうかを確認する必要があります(まだ最後の部分に取り組んでいます)。何らかの理由でこれらのチェックが機能せず、その理由がわかりません。
シェルで同じコードを書いたところ、問題なく動作しました。

私のコード:

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

番号がすでにボックスにあるかどうかを確認する方法はありますか?

ありがとう!

4

2 に答える 2

5

問題は、失敗しないチェックを見つけるとすぐに true を返すことです。したがって、有効な行がある場合、チェックはすでに成功していますが、列が同じ数でいっぱいになる可能性があります。

したがって、基本的には、すべての行を削除しreturn True、すべてのチェックが終わったら最後に 1 行追加します。

さらにいくつかのこと:

  • かっこを前後に入れTrueたりFalse、リターンに入れたりしないでください。
  • 後者はすでに機能を終了しているため、break後でする必要はありません。return
  • board[i][row]は 1 桁で評価されるためdigit in、 iterable を想定しているため、 でのチェックは機能しません。
  • board[i][row]board[i][column]最初のリストのインデックスはすでに行になっているはずです。

3x3 グループの 3 番目の条件が有効かどうかを確認するには、最初にセルが属する「ボックス」を特定し、次に内部のすべての数字を確認する必要があります。

# 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
于 2012-11-11T17:35:48.877 に答える
0

ユーザーのために数独を作成したい場合は、このヒントを使用して、ミラーモードで数字を削除します(私の英語で申し訳ありません)例

(1 _ 3 4)

        (7 _ 5 6) 
于 2012-11-11T18:43:13.503 に答える