原题链接
Note:就是给数组解出来,爆搜每一个位置,代码里每一句都详细注释了
代码如下:
class Solution {
public:
int row[9][9], col[9][9], cell[3][3][9];
void solveSudoku(vector<vector<char>>& board) {
memset(row, 0, sizeof row);
memset(col, 0, sizeof col);
memset(cell, 0, sizeof cell);
for(int i = 0; i < 9; i ++)
for(int j = 0; j < 9; j ++){
if(board[i][j] != '.'){
int num = board[i][j] - '1';
row[i][num] = col[j][num] = cell[i / 3][j / 3][num] = true;
}
}
dfs(board, 0, 0);
}
bool dfs(vector<vector<char>>&board, int x, int y){
if(y == 9) x ++, y = 0;
if(x == 9) return true;
if(board[x][y] != '.') return dfs(board, x, y + 1);
for(int i = 0; i < 9; i ++){
if(!row[x][i] && !col[y][i] && !cell[x / 3][y / 3][i]){
board[x][y] = i + '1';
row[x][i] = col[y][i] = cell[x / 3][y / 3][i] = true;
if(dfs(board, x, y + 1)) return true;
board[x][y] = '.';
row[x][i] = col[y][i] = cell[x / 3][y / 3][i] = false;
}
}
return false;
}
};