一定是一个9*9的数独,为了一遍遍历完,我们定义三个hash表。也就是三个二维数组,行列和九宫格。
row[i][j]存的是第i行的第j个数字是否存在,如果为0,证明在第i行第一次出现j,在遍历的时候就++。列也是如此。九宫格怎么定义每一块呢?
(i/3)*3 + j/3就是当前格子所在的九宫格,也是九个九宫格。如果当前这个数所在的行或者列或者九宫格有这个数字了,也就是对应的位为1,那就直接返回false
class Solution {
public:
bool isValidSudoku(vector<vector<char>>& board) {
//永远是9*9形式的数独,不是dfs就是dp
//行,列,九宫格三种状态都要搜索
int row[9][10] = {0};
int col[9][10] = {0};
int box[9][10] = {0};
for(int i = 0; i < board.size(); ++i){
for(int j = 0; j < board[0].size(); ++j){
if(board[i][j] == '.') continue;
int cur = board[i][j] - '0';
if(row[i][cur] != 0) return false;
if(col[j][cur] != 0) return false;
if(box[(i/3)*3+j/3][cur] != 0) return false;
row[i][cur]++;
col[j][cur]++;
box[(i/3)*3+j/3][cur]++;
}
}
return true;
}
};