Computer >> Máy Tính >  >> Lập trình >> Python

Chương trình xác thực lưới sudoku có thể giải được hay không bằng Python

Giả sử chúng ta có một lưới Sudoku 9 × 9. Chúng tôi phải kiểm tra xem điều đó có hợp lệ hay không. Chỉ các ô đã điền mới 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 số 9 (3−3) hộp con của lưới phải chứa các chữ số từ 1−9 mà không lặp lại.

Giả sử lưới Sudoku giống như -

Chương trình xác thực lưới sudoku có thể giải được hay không bằng Python

Điều này hợp lệ.

Để giải quyết vấn đề này, chúng tôi sẽ làm theo các bước sau -

  • cho tôi trong phạm vi từ 0 đến 8

    • tạo một số từ điển trống có tên là row, col và block, row_cube:=3 * (i / 3) và col_cube:=3 * (i mod 3)

    • cho j trong phạm vi từ 0 đến 8

      • nếu bảng [i, j] không trống và bảng [i, j] liên tiếp, thì trả về false

      • row [board [i, j]]:=1

      • nếu board [j, i] không trống và board [j, i] in col, thì trả về false

      • col [board [j, i]]:=1

      • rc:=row_cube + j / 3 và cc:=col_cube + j mod 3

      • nếu bảng [rc, cc] trong khối và bảng [rc, cc] không trống, thì trả về false

      • khối [board [rc, cc]]:=1

  • trả về true

Hãy cùng chúng tôi xem cách triển khai sau để hiểu rõ hơn -

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"]]))

Đầu vào

[
["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"]]

Đầu ra

True