Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> Python

Chương trình kiểm tra lưới Sudoku 9x9 có hợp lệ (có thể giải) hay không trong Python

Giả sử chúng ta có một lưới Sudoku 9x9. Chúng ta phải kiểm tra xem lưới đó có hợp lệ hay không. Chỉ các ô đã điền cần được xác thực theo các quy tắc sau:

  • Mỗi hàng phải chứa các chữ số từ 1-9 không lặp lại.
  • Mỗi cột phải chứa các chữ số từ 1-9 không lặp lại.
  • Mỗi trong 9 ô con 3x3 của lưới phải chứa các chữ số từ 1-9 không lặp lại.

Giả sử lưới Sudoku như sau:

Chương trình kiểm tra lưới Sudoku 9x9 có hợp lệ (có thể giải) hay không trong Python

Lưới này là hợp lệ.

Để giải quyết, chúng ta thực hiện các bước sau:

  • với i từ 0 đến 8:
    • tạo từ điển rỗng row, col, block; row_cube := 3 * (i // 3), col_cube := 3 * (i % 3)
    • với j từ 0 đến 8:
      • nếu board[i][j] không phải '.' VÀ board[i][j] trong row, trả về False
      • row[board[i][j]] := 1
      • nếu board[j][i] không phải '.' VÀ board[j][i] trong col, trả về False
      • col[board[j][i]] := 1
      • rc := row_cube + j//3, cc := col_cube + j%3
      • nếu board[rc][cc] trong block VÀ board[rc][cc] không phải '.', trả về False
      • block[board[rc][cc]] := 1
  • trả về True

Ví dụ

class Solution(object):
    def isValidSudoku(self, board):
        for i in range(9):
            row = {}
            column = {}
            block = {}
            row_cube = 3 * (i // 3)
            column_cube = 3 * (i % 3)
            for j in range(9):
                if board[i][j] != '.' and board[i][j] in row:
                    return False
                row[board[i][j]] = 1
                if board[j][i] != '.' and board[j][i] in column:
                    return False
                column[board[j][i]] = 1
                rc = row_cube + j // 3
                cc = column_cube + j % 3
                if board[rc][cc] in block and board[rc][cc] != '.':
                    return False
                block[board[rc][cc]] = 1
        return True

ob1 = Solution()
print(ob1.isValidSudoku([
    ["5","3",".",".","7",".",".",".","."],
    ["6",".",".","1","9","5",".",".","."],
    [".","9","8",".",".",".",".","6","."],
    ["8",".",".",".","6",".",".",".","3"],
    ["4",".",".","8",".","3",".",".","1"],
    ["7",".",".",".","2",".",".",".","6"],
    [".","6",".",".",".",".","2","8","."],
    [".",".",".","4","1","9",".",".","5"],
    [".",".",".",".",".","8",".","7","9"]
]))

Input

[ ["5","3",".",".","7",".",".",".","."], ["6",".",".","1","9","5",".",".","."], [".","9","8",".",".",".",".","6","."], ["8",".",".",".","6",".",".",".","3"], ["4",".",".","8",".","3",".",".","1"], ["7",".",".",".","2",".",".",".","6"], [".","6",".",".",".",".","2","8","."], [".",".",".","4","1","9",".",".","5"], [".",".",".",".",".","8",".","7","9"] ]

Output

True