[LeetCode] Valid Sudoku

Valid SudokuDetermine if a Sudoku is valid, according to: Sudoku Puzzles - The Rules.The Sudoku board could be partially filled, where empty cells are filled with the character `'.'`.A partially filled sudoku which is valid.Note:A valid Sudoku board (partially filled) is not necessarily solvable. Only the filled cells need to be validated.

```class Solution {
public:
bool isValidSudoku(vector<vector<char>>& board) {
//验证每一行是否有效
for(int i=0; i<9; i++){
if(!checkRowValid(board, i)){
return false;
}
}
//验证每一列是否有效
for(int i=0; i<9; i++){
if(!checkColumnValid(board, i)){
return false;
}
}
//验证每一格是否有效
for(int i=0; i<9; i=i+3){
for(int j=0; j<9; j=j+3){
if(!checkGridValid(board, i, j)){
return false;
}
}
}
return true;
}

//验证每个格是否有效，传入的是左上角的下标
bool checkGridValid(vector<vector<char>>& board, int m, int n){
bool flag[9];
memset(flag, 0, sizeof(bool)*9);
for(int i=m; i<m+3; i++){
for(int j=n; j<n+3; j++){
if(board[i][j]=='.'){
continue;
}
if(flag[board[i][j]-'1']){
return false;
}
flag[board[i][j]-'1']=true;
}
}
return true;
}

//验证每一行是否有效，传入的是行号
bool checkRowValid(vector<vector<char>>& board, int m){
bool flag[9];
memset(flag, 0, sizeof(bool)*9);
for(int i=0; i<9; i++){
if(board[m][i]=='.'){
continue;
}
if(flag[board[m][i]-'1']){
return false;
}
flag[board[m][i]-'1']=true;
}
return true;
}

//验证每一列是否有效，传入的是列号
bool checkColumnValid(vector<vector<char>>& board, int n){
bool flag[9];
memset(flag, 0, sizeof(bool)*9);
for(int i=0; i<9; i++){
if(board[i][n]=='.'){
continue;
}
if(flag[board[i][n]-'1']){
return false;
}
flag[board[i][n]-'1']=true;
}
return true;
}
};```

```class Solution {
public:
bool isValidSudoku(vector<vector<char>>& board) {
//验证每一行是否正确
for(int i=0; i<9; i++){
vector<bool> flag(9, false);
for(int j=0; j<9; j++){
if(board[i][j]!='.'){
if(flag[board[i][j]-'1']){
return false;
}else{
flag[board[i][j]-'1'] = true;
}
}
}
}

//验证每一列是否正确
for(int i=0; i<9; i++){
vector<bool> flag(9, false);
for(int j=0; j<9; j++){
if(board[j][i]!='.'){
if(flag[board[j][i]-'1']){
return false;
}else{
flag[board[j][i]-'1'] = true;
}
}
}
}

//验证每一宫是否正确，这里难点在于每一宫的下标对应关系
for(int i=0; i<9; i=i+3){
for(int j=0; j<9; j=j+3){
vector<bool> flag(9, false);
for(int x = i; x<i+3; x++){
for(int y=j; y<j+3; y++){
if(board[x][y]!='.'){
if(flag[board[x][y]-'1']){
return false;
}else{
flag[board[x][y]-'1'] = true;
}
}
}
}
}
}
return true;
}
};```