大家好,我是开车的阿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; // 该宫格符合规则 } };
在上面的代码中,我们使用了三个辅助函数 isValidRow
、isValidColumn
和 isValidGrid
来检查数独矩阵的每一行、每一列和每个3x3宫格是否符合规则。在每个辅助函数中,我们使用一个布尔型数组来标记1-9的数字是否已经出现过,如果出现重复数字,则说明不符合数独规则。最后,我们在 isValidTwilightSudoku
函数中调用这些辅助函数来检查整个数独矩阵是否符合规则。