回溯法
最坏情况时间复杂度O(9M),其中 M是空着格子的数量
代码语言:javascript复制class Solution {
private:
int size;
public:
bool notValid(vector<vector<char>>& board, int row, int col, char ch) {
for (int i = 0; i < size; i ) {
if (board[i][col] == ch || board[row][i] == ch) return true; // 行 列,是否有相同数字
if (board[row/3*3 i/3][col/3*3 i%3] == ch) return true; // 包含当前格子的3x3,是否有相同数字
}
return false;
}
bool backtrack(vector<vector<char>>& board, int i, int j) {
if (i == size) return true;
if (j == size) return backtrack(board, i 1, 0);
// 若该位置已有数字, 则跳过(此行代码不可写到backtrack外做判断)
if (board[i][j] != '.') return backtrack(board, i, j 1);
for (char ch = '1'; ch <= '9'; ch ) {
if (notValid(board, i, j, ch)) continue;
board[i][j] = ch;
if (backtrack(board, i, j 1)) return true; // 找到1种解法时直接退出遍历
board[i][j] = '.';
}
return false;
}
void solveSudoku(vector<vector<char>>& board) {
size = board.size();
for (int i = 0; i < size; i )
for (int j = 0; j < size; j )
if (backtrack(board, i, j)) return;
}
};
致谢
感谢「代码随想录」公众号梳理的思路和图片解释,欢迎大家关注这位大佬的公号