📜  门| GATE CS Mock 2018 |设置 2 |问题 6(1)

📅  最后修改于: 2023-12-03 15:42:13.398000             🧑  作者: Mango

门| GATE CS Mock 2018 |设置 2 |问题 6

本篇是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
代码解析
  • 在代码中,首先创建了三个布尔型二维数组rows、cols、boxes,用来记录每行、每列和每个小方格是否已经出现过的数字
  • 接着使用双重for循环遍历整个数独二维数组
  • 对于数独中的每个数字,检查它在行、列和小方格中是否已经出现过
  • 如果有重复,则不是合法的数独,返回False
  • 否则标记该数字,然后继续扫描下一个数字
  • 最后,如果整个数独扫描完成,且所有数字都没有重复出现,则数独是合法的,返回True
总结

本篇介绍了如何在python中,实现对一个9宫格的数独进行合法性检查的算法。我们采用了三个布尔型二维数组来记录已经出现过的数字。通过采用良好的数据结构,我们可以在遍历数独时,快速地检查数字出现的合法性。这种基于标记的方法可以应用到其他问题中,帮助开发者高效解决问题。