题目大意:给出数独的一部分,未填数字的地方为'.',判断目前给出的部分是否合法
分析:set的考察。简单考虑:循环判断每一行,循环判断每一列,循环判断每个小九宫格,这样很没必要。深入思考,利用3个set存储(分别代表每行、每列、每个小九宫格),一个二重循环即可。
数独一共有九个小九宫格,每个小九宫格都有九个小方格,那么第i个九宫格的第j个小方格的坐标为[i/3*3+j/3][i%3*3+j%3]。
代码:
class Solution {
public:
bool isValidSudoku(vector<vector<char>>& board) {
for(int i = 0;i < 9;i++){
unordered_set<char> row,column,grid;
for(int j = 0;j < 9;j++){
if(board[i][j] != '.'){
if(row.count(board[i][j])) return false;
else row.insert(board[i][j]);
}
if(board[j][i] != '.'){
if(column.count(board[j][i])) return false;
else column.insert(board[j][i]);
}
if(board[i / 3 * 3 + j / 3][i % 3 * 3 + j % 3] != '.'){
if(grid.count(board[i / 3 * 3 + j / 3][i % 3 * 3 + j % 3]))
return false;
else grid.insert(board[i / 3 * 3 + j / 3][i % 3 * 3 + j % 3]);
}
}
}
return true;
}
};