数独问题,深度遍历
class Solution {
public:
void solveSudoku(vector<vector<char> > &board) {
if(board.empty() || board.size() != 9 || board[0].size() != 9)
return;
solveSudokuAssist(board, 0, 0);
}
private:
bool solveSudokuAssist(vector<vector<char> > &board, int x, int y) {
if(y >= 9)
return solveSudokuAssist(board, x + 1, 0);
if(x >= 9)
return true;
if(board[x][y] == '.') {
for(int k = 1; k <= 9; k++) {
board[x][y] = (char)(k + '0');
if(isValid(board, x, y) && solveSudokuAssist(board, x, y + 1))
return true;
board[x][y] = '.';
}
} else {
return solveSudokuAssist(board, x, y + 1);
}
return false;
}
bool isValid(vector<vector<char> > &board, int x, int y) {
for(int i = 0; i < 9; i++) {
if(i != y && board[x][i] == board[x][y])
return false;
if(i != x && board[i][y] == board[x][y])
return false;
}
for(int i = (x / 3) * 3; i < (x / 3 + 1) * 3; i++) {
for(int j = (y / 3) * 3; j < (y / 3 + 1) * 3; j++) {
if(i != x && j != y && board[i][j] == board[x][y])
return false;
}
}
return true;
}
};