class Solution {
public:
bool helper(int r, int c, int mpRow[][9], int mpCol[][9], int mpGroup[][9], vector<vector<char> >& board) {
if (r >= 9) {
return true;
}
if (c >= 9){
c = 0;
if (helper(r+1, c, mpRow, mpCol, mpGroup, board))
return true;
return false;
}
if (board[r][c] != '.'){
if (helper(r, c+1, mpRow, mpCol, mpGroup, board))
return true;
return false;
}
for (int i = 0; i < 9; ++ i) {
int are = r/3*3+c/3;
if (board[r][c] == '.' && isValidNum(mpRow[r], mpCol[c], mpGroup[are], i)) {
board[r][c] = '1' + i;
mpRow[r][i] = mpCol[c][i] = mpGroup[are][i] = 1;
if (helper(r, c+1, mpRow, mpCol, mpGroup, board))
return true;
board[r][c] = '.';
mpRow[r][i] = mpCol[c][i] = mpGroup[are][i] = 0;
}
}
return false;
}
bool isValidNum(int *mpRow, int *mpCol, int *mpGroup, int num) {
if (mpRow[num] == 0 && mpCol[num] == 0 && mpGroup[num] == 0)
return true;
return false;
}
void solveSudoku(vector<vector<char> >& board) {
int mpRow[9][9] = {{0}};
int mpCol[9][9] = {{0}};
int mpGroup[9][9] = {{0}};
for (int i = 0; i < 9; ++ i) {
for (int j = 0; j < 9; ++ j) {
char c = board[i][j];
if (c == '.')
continue;
mpRow[i][c-'1'] = 1;
mpCol[j][c-'1'] = 1;
mpGroup[i/3*3+j/3][c-'1'] = 1;
}
}
helper(0, 0, mpRow, mpCol, mpGroup, board);
}
};
Sudoku Solver : 53 lines and 12 ms
最新推荐文章于 2022-08-16 17:53:54 发布