Determine if a 9x9 Sudoku board is valid. Only the filled cells need to be validated according to the following rules:
1. Each row must contain the digits 1-9 without repetition.
2. Each column must contain the digits 1-9 without repetition.
3. Each of the 9 3x3 sub-boxes of the grid must contain the digits 1-9 without repetition.
就是判断数独是否合法,主要就是上面这三个原则。每行每列以及每3x3的小格子都不存在重复的数字。
思路
先判断9x9的格子每行每列是否重复。再判断每个3x3的小格子是否重复。算法没啥难度。主要是代码实现的一些小技巧。
class Solution:
def isValidArray(self, array) -> bool:
keyMap = set()
for a in array:
if str(a) is not '.':
if str(a) in keyMap:
return False
else:
keyMap.add(str(a))
return True
def isValidRect(self, board: List[List[str]]) -> bool:
keyMap = set()
for i in range(len(board)):
row = board[i]
for j in range(len(row)):
if str(board[i][j]) is not '.':
if str(board[i][j]) in keyMap:
return False
else:
keyMap.add(str(board[i][j]))
return True
def isValidSudoku(self, board: List[List[str]]) -> bool:
allValid = True
for i in range(len(board)):
row = board[i]
validRow = self.isValidArray(row)
if validRow == False:
allValid = False
return allValid
# 注意这里取列的方法
cols = [row[i] for row in board]
validCol = self.isValidArray(cols)
if validCol == False:
allValid = False
return allValid
row = 0
col = 0
while row < 9 and col < 9:
# 取3x3的小格子的方法
partBoard = [i[col:col+3] for i in board[row:row+3]]
partBoardValid = self.isValidRect(partBoard)
if partBoardValid == False:
return False
col+=3
if col == 9:
col = 0
row+=3
return True
THE END.