/**
* Index: 37
* Title: Sudoku Solver
* Author: ltree98
**/
刚刚做了一个检查数独是否合法。
这次,就是来解这个数独了。
用的最简单最暴力的办法 —— 回溯
- 遍历数独,从左至右,从上到下的顺序
- 遇到数字,过
- 遇到非数字,开始准备填数
- 从1-9开始填(判断填上去是否合规则)
- 有合规则的,继续向后遍历
- 如果没有合规则的,说明前面有填错的,回到上一层向下重填
- 从1-9开始填(判断填上去是否合规则)
class Solution {
private:
bool isLegal(vector<vector<char>>& board, int row, int col, char number) {
int s = row/3*3 + col/3;
for(int i = 0; i < 9; i++)
if(board[i][col] == number)
return false;
for(int j = 0; j < 9; j++)
if(board[row][j] == number)
return false;
int sR = row - row%3, sC = col - col%3;
for(int i = 0; i < 3; i++)
for(int j = 0;j < 3; j++)
if(board[sR+i][sC+j] == number)
return false;
return true;
}
bool traversalSudoku(vector<vector<char>>& board, int row, int col) {
if(col > 8) {
++row;
col = 0;
}
if(row > 8)
return true;
if(board[row][col] == '.') {
for(char num = '1'; num <= '9'; num++) {
if(isLegal(board, row, col, num)) {
board[row][col] = num;
if(traversalSudoku(board, row, col+1)) {
return true;
}
board[row][col] = '.';
}
}
return false;
}
return traversalSudoku(board, row, col+1);
}
public:
void solveSudoku(vector<vector<char>>& board) {
traversalSudoku(board, 0, 0);
}
};