36. Valid Sudoku
Determine if a Sudoku is valid, according to: Sudoku Puzzles - The Rules.
The Sudoku board could be partially filled, where empty cells are filled with the character '.'
.
A partially filled sudoku which is valid.
Note:
A valid Sudoku board (partially filled) is not necessarily solvable. Only the filled cells need to be validated.
36.有效数独
判断一个数独是不是有效的。参考:数独规则
数独的边界能被部分填充,空的地方填充字符'.'。
如图是一个部分填充的数独并且是有效的。
注意:
一个有效的数独不一定有解。只需要验证填充的地方就行了。
思路:按规则来逐行逐列逐九宫格判断是不是有重复数字就行了。每次判断时新建一个数组,每找到一个数先判断数组中是否有这个数,有的话就无效,没有就填进去。因为数是0-9的,所以可以建一个长度为10的数组采用计数的方式让数字对应下标,也可以图省事用ascii码对应数组下标。
bool isValidSudoku(char** board, int boardRowSize, int boardColSize) {
for (int i = 0; i < boardRowSize; i++){
bool t[128] = {false};
for (int j = 0; j < boardColSize; j++){
if (board[i][j] == '.') continue;
if (t[board[i][j]]) return false;
else t[board[i][j]] = true;
}
}
for (int j = 0; j < boardColSize; j++){
bool t[128] = {false};
for (int i = 0; i < boardRowSize; i++){
if (board[i][j] == '.') continue;
if (t[board[i][j]]) return false;
else t[board[i][j]] = true;
}
}
for (int i = 0; i < 3; i++){
for (int j = 0; j < 3; j++){
bool t[128] = {false};
for (int m = 0; m < boardRowSize / 3; m++){
for (int n = 0; n < boardColSize / 3; n++){
if (board[i*3+m][j*3+n] == '.') continue;
if (t[board[i*3+m][j*3+n]]) return false;
else t[board[i*3+m][j*3+n]] = true;
}
}
}
}
return true;
}
class Solution(object):
def isValidSudoku(self, board):
"""
:type board: List[List[str]]
:rtype: bool
"""
for line in board:
for i, cell in enumerate(line):
if cell != '.' and cell in line[:i]:
return False
board2 = zip(*board)
for column in board2:
for i, cell in enumerate(column):
if cell != '.' and cell in column[:i]:
return False
for i in range(3):
for j in range(3):
num = []
for m in range(3):
for n in range(3):
cell = board[i*3+m][j*3+n]
if cell != '.':
if cell in num:
return False
else: num.append(cell)
return True