37. 解数独
编写一个程序,通过填充空格来解决数独问题。
数独的解法需 遵循如下规则:
数字 1-9 在每一行只能出现一次。
数字 1-9 在每一列只能出现一次。
数字 1-9 在每一个以粗实线分隔的 3x3 宫内只能出现一次。(请参考示例图)
数独部分空格内已填入了数字,空白格用 ‘.’ 表示。
https://leetcode.cn/problems/sudoku-solver/
class Solution {
public:
bool cols[9][9];
bool rows[9][9];
bool cubes[9][9];
vector<pair<int, int>> positions;
bool valid = false;
void dps(vector<vector<char>>& board, int pos) {
if (pos == positions.size()) {
valid = true;
return;
}
auto [x, y] = positions[pos];
for (int num = 0; num < 9 && !valid; num++) {
if (!cols[x][num] && !rows[y][num] && !cubes[((int)(x / 3)) * 3 + (y / 3)][num]) {
cols[x][num] = 1;
rows[y][num] = 1;
cubes[((int)(x / 3)) * 3 + (y / 3)][num] = 1;
board[x][y] = num + 1 + '0';
dps(board, pos + 1);
cols[x][num] = 0;
rows[y][num] = 0;
cubes[((int)(x / 3)) * 3 + (y / 3)][num] = 0;
}
}
}
void solveSudoku(vector<vector<char>>& board) {
memset(cols, 0, sizeof(cols));
memset(rows, 0, sizeof(rows));
memset(cubes, 0, sizeof(cubes));
for (int i = 0; i < 9; i++) {
for (int j = 0; j < 9; j++) {
if (board[i][j] != '.') {
int num = board[i][j] - '0' - 1;
cols[i][num] = 1;
rows[j][num] = 1;
cubes[((int)(i / 3)) * 3 + (j / 3)][num] = 1;
} else {
// 空的
positions.emplace_back(i, j);
}
}
}
dps(board, 0);
}
};