Valid Sudoku
Written by Ron on 010111 April 000112011. Posted in Blog
Determine if a 9 x 9 Sudoku board is valid. Only the filled cells need to be validated according to the following rules:
Each row must contain the digits 1-9 without repetition.
Each column must contain the digits 1-9 without repetition.
Each of the nine 3 x 3 sub-boxes of the grid must contain the digits 1-9 without repetition.
Note:
A Sudoku board (partially filled) could be valid but is not necessarily solvable.
Only the filled cells need to be validated according to the mentioned rules.
Example 1:
Input: board =
[["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
Example 2:
Input: board =
[["8","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: false
Explanation: Same as Example 1, except with the 5 in the top left corner being modified to 8. Since there are two 8's in the top left 3x3 sub-box, it is invalid.
from typing import List
class Solution:
def isValidSudoku(self, board: List[List[str]]) -> bool:
rows = set()
cols = set()
cube = set()
for r in range(len(board)):
for c in range(len(board[0])):
digit = board[r][c]
if digit == ".": continue
print(r, c, digit, cube)
if (r,digit) in rows: return False
if (c,digit) in cols: return False
if (r//3,c//3,digit) in cube: return False
rows.add((r,digit))
cols.add((c,digit))
cube.add((r//3,c//3,digit))
return True
def isValidSudoku(self, board: List[List[str]]) -> bool:
cube = []
for row in range(len(board)):
temp = []
t_c = []
for n in range(len(board[0])):
if board[row][n] != ".":
temp.append(board[row][n])
# for check cubes
if (n+1) % 3 == 0:
if board[row][n] != ".": t_c.append(board[row][n],)
cube.append(t_c)
t_c = []
else:
if board[row][n] != ".": t_c.append(board[row][n],)
if len(set(temp)) != len(temp): return False
for i in range(3):
if len(set(sum(cube[i::3][0:3], []))) != len(sum(cube[i::3][0:3], [])): return False
if len(set(sum(cube[i::3][3:6], []))) != len(sum(cube[i::3][3:6], [])): return False
if len(set(sum(cube[i::3][6:9], []))) != len(sum(cube[i::3][6:9], [])): return False
for n in range(len(board[0])):
temp = []
for row in range(len(board)):
if board[row][n].isnumeric(): temp.append(board[row][n])
if len(set(temp)) != len(temp): return False
return True
s = Solution()
print(s.isValidSudoku([
[".",".",".",".",".",".","5",".","."],
[".",".",".",".",".",".",".",".","."],
[".",".",".",".",".",".",".",".","."],
["9","3",".",".","2",".","4",".","."],
[".",".","7",".",".",".","3",".","."],
[".",".",".",".",".",".",".",".","."],
[".",".",".","3","4",".",".",".","."],
[".",".",".",".",".","3",".",".","."],
[".",".",".",".",".","5","2",".","."]]))#false
print(s.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"]]))#true
print(s.isValidSudoku([
["8","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"]])) #false