自己写的最少行的版本,感觉背下来都要敲25分钟
class Solution {
public:
bool solveSudoku(vector> &v1, vector> &v2,
vector> &v3, vector > &board) {
for (int i = 0; i < board.size(); ++i)
for (int j = 0; j < board.size(); ++j)
if (board[i][j] == '.') {
int k = (i/3)*(board.size()/3) + j/3;
for (char c = '1'; c <= '9'; ++c) {
if (v1[i].find(c) == v1[i].end() && v2[j].find(c) ==
v2[j].end() && v3[k].find(c) == v3[k].end()) {
v1[i].insert(c); v2[j].insert(c); v3[k].insert(c
);
board[i][j] = c;
if(solveSudoku(v1, v2, v3, board)) return true;
board[i][j] = '.';
v1[i].erase(c); v2[j].erase(c); v3[k].erase(c);
}
}
return false;
}
return true;
}
void solveSudoku(vector > &board) {
vector> v1(board.size(), set()), v2(board.size(),
set());
vector> v3(board.size()/3*board.size()/3, set());
for (int i = 0; i < board.size(); ++i)
for (int j = 0; j < board.size(); ++j)
if (board[i][j] != '.') {
v1[i].insert(board[i][j]);
v2[j].insert(board[i][j]);
v3[(i/3)*(board.size()/3) + j/3].insert(board[i][j]);
}
solveSudoku(v1, v2, v3, board);
}
};