题目思路:
1.初始化数据结构:
使用三个向量,每个向量包含9个集合,用于分别记录每一行、每一列和每个3x3小格子中已经出现的数字。
2.遍历每个格子:
如果格子是空的(用‘.’表示),则跳过。
计算当前数字所属的3x3小格子的索引。
3.检查重复:
检查该数字是否在当前行、列或3x3小格子中已经存在。
如果存在,说明数独无效,返回false。
4.记录数字:
如果没有重复,将数字添加到对应的行、列和小格子的集合中。
5.返回结果:
如果所有格子检查完毕且没有发现重复,返回true,表示数独有效。
下面是详细的c++代码:
// 函数用于检查数独是否有效
bool isValidSudoku(const std::vector<std::vector<char>>& board) {
// 用于跟踪每一行、每一列和每个3x3小格子中的数字
std::vector<std::unordered_set<char>> rows(9);
std::vector<std::unordered_set<char>> cols(9);
std::vector<std::unordered_set<char>> boxes(9);
// 遍历数独的每个格子
for (int r = 0; r < 9; ++r) {
for (int c = 0; c < 9; ++c) {
char num = board[r][c];
if (num == '.') continue; // 跳过空白格
// 计算当前数字所在的3x3小格子索引
int boxIndex = (r / 3) * 3 + (c / 3);
// 检查数字是否已在当前行、列或小格子中出现
if (rows[r].count(num) || cols[c].count(num) || boxes[boxIndex].count(num)) {
return false; // 如果出现重复,则数独无效
}
// 如果没有重复,将数字添加到相应的集合中
rows[r].insert(num);
cols[c].insert(num);
boxes[boxIndex].insert(num);
}
}
// 如果所有格子都检查通过,则数独有效
return true;
}