判断一个 9x9 的数独是否有效。只需要根据以下规则,验证已经填入的数字是否有效即可。
- 数字
1-9
在每一行只能出现一次。 - 数字
1-9
在每一列只能出现一次。 - 数字
1-9
在每一个以粗实线分隔的3x3
宫内只能出现一次。
上图是一个部分填充的有效的数独。
数独部分空格内已填入了数字,空白格用 '.'
表示。
说明:
- 一个有效的数独(部分已被填充)不一定是可解的。
- 只需要根据以上规则,验证已经填入的数字是否有效即可。
- 给定数独序列只包含数字
1-9
和字符'.'
。 - 给定数独永远是
9x9
形式的。
这道题只是要求判断是不是一个有效的数独,因此只需要按照数独的条件判断就行了。
数字 1-9 在每一行只能出现一次。
数字 1-9 在每一列只能出现一次。
数字 1-9 在每一个以粗实线分隔的 3x3 宫内只能出现一次。
判断是否出现过,结合集合set更加好判断。
当判断以粗实线分隔的 3x3 格子的时候,由于数独整体总是9*9的,而实现分割的各个部分又是固定的,因此
可以每个3*3的格子对应一个set集合。对于每个点的横纵坐标都整除以3这样就一个的3*3格子都对应了一个
元素。 res[i//3][j//3],在res是一个3*3的列表,每一个元素是一个set,对应一个3*3格子。
/:返回的是浮点数结果
//:整除,返回的是整数,数值上就是除法/结果的整数部分
python中的!不能用于 !True之类的,只能作为数值比较中的不等号,要对布尔型变量取非的话需要用not,即not True 这类的才可以。
class Solution:
def check_row(self,board): # 检查行
for i in range(9):
map_c = set()
for j in range(9):
if board[i][j] == '.':
continue
elif board[i][j] not in map_c:
map_c.add(board[i][j])
elif board[i][j] in map_c:
return False
return True
def check_col(self,board): # 检查列
for j in range(9):
map_c = set()
for i in range(9):
if board[i][j] == '.':
continue
elif board[i][j] not in map_c:
map_c.add(board[i][j])
elif board[i][j] in map_c:
return False
return True
def check_nine(self,board): # 检查每个以粗实线分隔的 3x3 格子
res=[]
for i in range(3):
res.append([])
for i in range(3):
for j in range(3):
res[i].append(set())
for i in range(9):
for j in range(9):
if board[i][j] == '.':
continue
elif board[i][j] not in res[i//3][j//3]:
res[i//3][j//3].add(board[i][j])
elif board[i][j] in res[i//3][j//3]:
return False
return True
def isValidSudoku(self, board: List[List[str]]) -> bool:
if not self.check_row(board):
return False
if not self.check_col(board):
return False
if not self.check_nine(board):
return False
return True