大家好,我是开车的阿Q,自动驾驶的时代已经到来,没时间解释了,快和阿Q一起上车。作为自动驾驶系统工程师,必须要有最好的C++基础,让我们来一起刷题吧。

题目考察的知识点

本题考察的是对于9x9的数独矩阵是否满足规则的判断。

题目解答方法的文字分析

我们可以使用哈希表来解决这个问题。首先,我们需要分别检查每一行、每一列以及每个3x3宫内的数字是否符合规则。对于每一行和每一列,我们可以使用一个长度为9的布尔型数组来标记1-9的数字是否已经出现过。对于每个3x3宫内的数字,我们可以根据宫格规则进行检查。

本题解析所用的编程语言 (C++)

C++

完整且正确的编程代码

class Solution {
public:
    bool isValidTwilightSudoku(vector<vector<char>>& board) {
        // 检查每一行是否符合规则
        for (int i = 0; i < 9; ++i) {
            if (!isValidRow(board, i)) {
                return false;
            }
        }
        
        // 检查每一列是否符合规则
        for (int j = 0; j < 9; ++j) {
            if (!isValidColumn(board, j)) {
                return false;
            }
        }
        
        // 检查每个3x3宫格是否符合规则
        for (int i = 0; i < 9; i += 3) {
            for (int j = 0; j < 9; j += 3) {
                if (!isValidGrid(board, i, j)) {
                    return false;
                }
            }
        }
        
        return true;
    }
    
    // 检查一行是否符合规则
    bool isValidRow(vector<vector<char>>& board, int row) {
        vector<bool> used(9, false); // 用于标记1-9的数字是否已经出现过
        for (int j = 0; j < 9; ++j) {
            if (board[row][j] != '.') {
                int num = board[row][j] - '1'; // 将字符转换为数字
                if (used[num]) {
                    return false; // 如果该数字已经出现过,则说明不符合规则
                }
                used[num] = true; // 将该数字标记为已出现过
            }
        }
        return true; // 该行符合规则
    }
    
    // 检查一列是否符合规则
    bool isValidColumn(vector<vector<char>>& board, int col) {
        vector<bool> used(9, false); // 用于标记1-9的数字是否已经出现过
        for (int i = 0; i < 9; ++i) {
            if (board[i][col] != '.') {
                int num = board[i][col] - '1'; // 将字符转换为数字
                if (used[num]) {
                    return false; // 如果该数字已经出现过,则说明不符合规则
                }
                used[num] = true; // 将该数字标记为已出现过
            }
        }
        return true; // 该列符合规则
    }
    
    // 检查一个3x3宫格是否符合规则
    bool isValidGrid(vector<vector<char>>& board, int row, int col) {
        vector<bool> used(9, false); // 用于标记1-9的数字是否已经出现过
        for (int i = row; i < row + 3; ++i) {
            for (int j = col; j < col + 3; ++j) {
                if (board[i][j] != '.') {
                    int num = board[i][j] - '1'; // 将字符转换为数字
                    if (used[num]) {
                        return false; // 如果该数字已经出现过,则说明不符合规则
                    }
                    used[num] = true; // 将该数字标记为已出现过
                }
            }
        }
        return true; // 该宫格符合规则
    }
};

在上面的代码中,我们使用了三个辅助函数 isValidRowisValidColumnisValidGrid 来检查数独矩阵的每一行、每一列和每个3x3宫格是否符合规则。在每个辅助函数中,我们使用一个布尔型数组来标记1-9的数字是否已经出现过,如果出现重复数字,则说明不符合数独规则。最后,我们在 isValidTwilightSudoku 函数中调用这些辅助函数来检查整个数独矩阵是否符合规则。

您的关注、点赞、收藏就是我创作的动力,三连支持阿Q!