本题的核心就是确保:每一行中没有重复数字、每一列中没有重复数字、每个3 x 3 子数独内没有重复数字。简单思路即通过暴力求解遍历三次数独来求解,但实际上只需遍历一次数独即可:
数独元素对应块号的计算方法:block_index = (row / 3) * 3 + columns / 3
代码如下:
class Solution {
public:
bool isValidSudoku(vector>& board) {
vector> row(9, vector(9, false)); //记录行,默认初始化9个元素全为false
vector> col(9, vector(9, false)); //记录列,默认初始化9个元素全为false
vector> block(9, vector(9, false)); //记录块,默认初始化9个元素全为false
for(int i = 0; i < 9; i++){
for(int j = 0; j < 9; j++){
if(board[i][j] != '.'){
int block_num = i / 3 * 3 + j / 3; //计算块号
int num = board[i][j] - '1'; //计算当前元素的索引大小
//元素在对应的行/列/块已出现过
if(row[i][num] || col[num][j] || block[block_num][num])
return false;
//元素在对应的行/列/块未出现过,那么将对应索引下标的行/列/块元素置为true
else{
row[i][num] = true;
col[num][j] = true;
block[block_num][num] = true;
}
}
}
}
return true;
}
};