请你判断一个 9 x 9
的数独是否有效。只需要 根据以下规则 ,验证已经填入的数字是否有效即可。
- 数字
1-9
在每一行只能出现一次。 - 数字
1-9
在每一列只能出现一次。 - 数字
1-9
在每一个以粗实线分隔的3x3
宫内只能出现一次
在c++中解决这个问题可以通过使用三种数据结构分别判断每一行每一列和和每一个3x3矩阵是否有相同的数字,综上所述可以使用哈希表的方法(可以认为是一种暴力解法)
输入为一个矩阵board,类型为vector<vector<char>>
第一步,定义三个向量,向量中的元素为哈希表<int>,行row(9),列cols(9),3x3矩阵blocks(9)
第二步定义for循环行(int i=0;i<9;++i)列(int j=0;j<n;j++)
第三步 取出矩阵中的值board[i][j],判断其是否为‘.'若不是则转为int n,并计算矩阵的指针,一共也是从0到8,若是,则跳到第五步(此时n未变)
第四步,判断其是否在该行,该列,该矩阵出现过,若出现过,return false(循环结束)若不是跳转到下一步
第五步 将n存入该行,该列,该矩阵的哈希表中
第六步重回for循环,循环结束后return true
流程图为
class Solution {
public:
bool isValidSudoku(vector<vector<char>>& board) {
// 使用数组来存储每行、每列和每个block的数字出现情况
vector<unordered_set<int>> rows(9), cols(9), blocks(9);
for (int i = 0; i < 9; i++) { // 遍历行
for (int j = 0; j < 9; j++) { // 遍历列
char num = board[i][j];
if (num != '.') { // 如果不是空格,则进行检查
int n = num - '0'; // 转换成整数
int block_index = (i / 3) * 3 + j / 3; // 计算3x3宫格的索引
// 检查行、列、宫格是否已经有这个数字
if (rows[i].count(n) || cols[j].count(n) || blocks[block_index].count(n)) {
return false; // 如果有重复,则不是有效的数独
}
// 在行、列、宫格中标记这个数字已出现
rows[i].insert(n);
cols[j].insert(n);
blocks[block_index].insert(n);
}
}
}
return true; // 如果没有发现任何重复,那么这是一个有效的数独
}
};