判断一个 9x9 的数独是否有效。只需要根据以下规则,验证已经填入的数字是否有效即可。
- 数字
1-9
在每一行只能出现一次。 - 数字
1-9
在每一列只能出现一次。 - 数字
1-9
在每一个以粗实线分隔的3x3
宫内只能出现一次。
![](https://img.haomeiwen.com/i13487996/9053dc53a68bb03b.png)
上图是一个部分填充的有效的数独。
数独部分空格内已填入了数字,空白格用 '.'
表示。
输入:
[
["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
解答:
这道题相对来讲稍微难一点,需要考虑多种情况,判断行,判断列,判断3x3的块。
class Solution:
"""
:type board: List[List[str]]
:rtype: bool
"""
import collections
def isValidSudoku(self, board):
## check row
for i in range(9):
dic1 = collections.Counter(board[i])
for k,v in dic1.items():
if k!='.' and v>1:
return False
## check column
for j in range(9):
dic2 = collections.Counter([x[j] for x in board])
for k,v in dic2.items():
if k!='.' and v>1:
return False
## check block
for i in range(9):
for j in range(9):
## 关键在于这个部分,当i和j为0,3,6的时候,判断block是否有效
if i%3==0 and j%3==0:
if not Solution.checkblock(board,i,j):
return False
return True
def checkblock(board,r,c):
dic = {}
for i in range(r,r+3):
for j in range(c,c+3):
if board[i][j]!='.':
if board[i][j] in dic:
return False
dic[board[i][j]]=1
return True
网友评论