暴力可过
class Solution {
public:
bool hang[9][9] = {}, lie[9][9] = {}, ge[9][9] = {};
bool solve(vector<vector<char>>& board) {
for (int i = 0; i<9; ++i)
for (int j = 0; j < 9; ++j) {
if (board[i][j] == '.') {
bool tmp[9] = {};
for (int k = 0; k < 9; ++k)
if (hang[i][k] || lie[j][k]
|| ge[i / 3 * 3 + j / 3][k]) tmp[k] = true;
for (int k = 0; k < 9; ++k)
if (!tmp[k]) {
board[i][j] = k + '1';
bool A[3] = { hang[i][k],lie[j][k],ge[i / 3 * 3 + j / 3][k] };
hang[i][k] = lie[j][k] = ge[i / 3 * 3 + j / 3][k] = true;
if (solve(board)) return true;
board[i][j] = '.';
hang[i][k] = A[0], lie[j][k] = A[1], ge[i / 3 * 3 + j / 3][k] = A[2];
}
return false;
}
}
return true;
}
void solveSudoku(vector<vector<char>>& board) {
char x;
for (int i = 0; i < 9; ++i)
for (int j = 0; j < 9; ++j)
if ((x = board[i][j]) != '.')
hang[i][x - '1'] = lie[j][x - '1'] = ge[i / 3 * 3 + j / 3][x - '1'] = true;
while (1) {
bool _change = false;
for (int i = 0; i < 9; ++i) {
for (int j = 0; j < 9; ++j)
if (board[i][j] == '.') {
bool tmp[9] = {};
int n = 0, val;
for (int k = 0; k < 9; ++k)
if (hang[i][k] || lie[j][k] || ge[i / 3 * 3 + j / 3][k]) tmp[k] = true;
for (int k = 0; k < 9; ++k)
if (!tmp[k]) ++n, val = k;
if (n == 1) _change = true, board[i][j] = val + '1', hang[i][val] = lie[j][val] = ge[i / 3 * 3 + j / 3][val] = true;
}
}
if (!_change) break;
}
solve(board);
}
};