判断一个 9x9 的数独是否有效。只需要根据以下规则,验证已经填入的数字是否有效即可。
上图是一个部分填充的有效的数独。数独部分空格内已填入了数字,空白格用 ‘.’ 表示。
示例 1:
输入:
[
["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
示例 2:
输入:
[
["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
解释: 除了第一行的第一个数字从 5 改为 8 以外,空格内其他数字均与 示例1 相同。
但由于位于左上角的 3x3 宫内有两个 8 存在, 因此这个数独是无效的。
说明:
- 一个有效的数独(部分已被填充)不一定是可解的
- 只需要根据以上规则,验证已经填入的数字是否有效即可
- 给定数独序列只包含数字 1-9 和字符 ‘.’
- 给定数独永远是 9x9 形式的。
该题虽然为数独问题,但是并不要求找到它对应的可行解,而只需要判断当前给出的数独棋盘是否合法,即此时是否满足三条规则。由于棋盘可分为如下的九个方格,那么每个方格都可以使用它左上角的坐标表示。在判断的流程中,我们使用逐个方格的方式进行判断,为了便于判断某个格子中的数字是否违反了规则,定义如下的数据结构:
Python解题代码如下:
class Solution:
def __init__(self):
# 用于记录0 - 8 行,每一行的字符
self.rows = {}
# 用于记录0 - 8 列,每一列的字符
self.cols = {}
// 初始化rows和cols的值为list形式
for i in range(0, 9):
self.rows["{}".format(i)] = []
self.cols["{}".format(i)]= []
def helpers(self, board, row, col) -> bool:
# 用于保存某个方格中的字符
blog = []
# 每个方格都是 3 * 3 大小
for i in range(0, 3):
for j in range(0, 3):
ch = board[row + i][col + j]
r = self.rows.get("{}".format(row + i))
c = self.cols.get("{}".format(col + j))
# 如果当前位置所在的行、列或者方格中已有该字符,直接返回false
if ch != '.' and ch in r or ch != '.' and ch in c or ch!='.' and ch in blog:
return False
# 否则保存当前字符,便于后续判断
else:
self.rows["{}".format(row + i)].append(ch)
self.cols["{}".format(col + j)].append(ch)
blog.append(ch)
return True
def isValidSudoku(self, board)->bool:
# 这里以3为步长,正好可以表示每个方格的左上角坐标
for row in range(0, 7, 3):
for col in range(0, 7, 3):
r = self.helpers(board, row, col)
if r == False:
return False
else:
continue
return True