. - 力扣(LeetCode)
- 数字1-9在每一行只能出现一次。
- 数字1-9在每一列只能出现一次。
- 数字1-9在每一个以粗实线分隔的3×3宫内只能出现一次。
| |
class Solution {
private:
bool isValid(int row, int col, char num, vector<vector<char>>& board) { // 判断放入num是否合法
for (int i = 0; i < board.size(); i++) {
if (board[row][i] == num || board[i][col] == num) {
return false;
}
}
int m = row - (row % 3);
int n = col - (col % 3);
for (int i = m; i < m + 3; i++) {
for (int j = n; j < n + 3; j++) {
if (board[i][j] == num) {
return false;
}
}
}
return true;
}
bool backtracking(vector<vector<char>>& board) {
for (int i = 0; i < board.size(); i++) { // 遍历行
for (int j = 0; j < board[0].size(); j++) { // 遍历列
if (board[i][j] != '.')
continue; // 只有遇到空位置才进行操作
for (char k = '1'; k <= '9'; k++) { // 尝试1~9
if (isValid(i, j, k, board)) {
board[i][j] = k; // 如果合法就放进去
if (backtracking(board)) {
return true; // 找到了一个填满棋盘的解就返回true,逐层返回->结束
}
board[i][j] = '.'; // 回溯
}
}
return false; // 1~9没有能放进去的就代表不行,直接返回false,然后进入回溯
}
}
return true; // 当整个board填满之后返回true
}
public:
void solveSudoku(vector<vector<char>>& board) {
if (backtracking(board)) {
return;
}
}
};