📅  最后修改于: 2023-12-03 15:42:13.398000             🧑  作者: Mango
本篇是GATE CS模拟考试2018年第2组的第6道题目。本题目要求考生设计一份代码,能够检查一个9宫格的数独是否是合法的,如合法则返回真,不合法则返回假。本题目可以考察考生对于数据结构及算法的应用能力。
数独一共有9行9列,可以将整个数独视为一个二维数组。其中,已经包含的数字用数字表示,未填写的空格用0表示。因为行、列及33的小方格内都不能有重复的数字,所以我们可以采用三个布尔型二维数组rows、cols、boxes分别记录每行、每列和每个小方格是否已经出现过的数字。第[i][j]个元素在数独中对应的行和列编号分别是i和j,对应的33小方格编号可以用(i/3)*3+j/3来计算。遍历整个数独时,将每个出现的数字在对应的数组中进行标记。当扫描到一个数字时,检查它在行、列和小方格中是否已经出现,如果有重复,则不是合法的数独;否则标记该数字出现过,然后继续扫描下一个数字,直到整个数独扫描完成。最后,如果整个数独扫描完成,且所有数字都没有重复出现,则数独是合法的。
def is_valid_sudoku(board: List[List[str]]) -> bool:
rows = [[False] * 9 for _ in range(9)]
cols = [[False] * 9 for _ in range(9)]
boxes = [[False] * 9 for _ in range(9)]
for i in range(9):
for j in range(9):
if board[i][j] != '.':
val = int(board[i][j]) - 1
k = i // 3 * 3 + j // 3
if rows[i][val] or cols[j][val] or boxes[k][val]:
return False
rows[i][val] = cols[j][val] = boxes[k][val] = True
return True
本篇介绍了如何在python中,实现对一个9宫格的数独进行合法性检查的算法。我们采用了三个布尔型二维数组来记录已经出现过的数字。通过采用良好的数据结构,我们可以在遍历数独时,快速地检查数字出现的合法性。这种基于标记的方法可以应用到其他问题中,帮助开发者高效解决问题。