大家好,我是开车的阿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 函数中调用这些辅助函数来检查整个数独矩阵是否符合规则。

京公网安备 11010502036488号