Description
Write a program to solve a Sudoku puzzle by filling the empty cells.
A sudoku solution must satisfy all of the following rules:
Each of the digits 1-9 must occur exactly once in each row.
Each of the digits 1-9 must occur exactly once in each column.
Each of the the digits 1-9 must occur exactly once in each of the 9 3x3 sub-boxes of the grid.
Empty cells are indicated by the character ‘.’.
A sudoku puzzle…
…and its solution numbers marked in red.
Note
- The given board contain only digits 1-9 and the character ‘.’.
- You may assume that the given Sudoku puzzle will have a single unique solution.
- The given board size is always 9x9.
Analyse
这个就是上一道题的解决版,也就是给你一个数独,然后要求你解出答案(输入保证有解)。
实不相瞒,一开始我想了很多的骚操作,像很多平时人工解数独的方法都想用上去,但总是想着想着,要是我的方法解不出来怎么办,最终还是屈服了,直接一个DFS砸过去,搞定。(这里能顺便用一下上一道题的判断数独是否有效的函数。)时间复杂度为
O
(
9
m
)
O(9^m)
O(9m)(m为空格子的数量)
Code
class Solution {
public:
bool isValid(vector<vector<char>>& board, int row, int col, char c){
for (int i = 0; i < 9; i++) {
if(board[i][col] != '.' && board[i][col] == c) return false;
if(board[row][i] != '.' && board[row][i] == c) return false;
if(board[3 * (row / 3) + i / 3][ 3 * (col / 3) + i % 3] != '.' && board[3 * (row / 3) + i / 3][3 * (col / 3) + i % 3] == c) return false;
}
return true;
}
bool solve(vector<vector<char>>& board) {
for (int i = 0; i < 9; i++){
for (int j = 0; j < 9; j++){
if (board[i][j] == '.'){
for (char c = '1'; c <= '9'; c++){
if (isValid(board, i, j, c)){
board[i][j] = c;
if (solve(board)) {
return true;
} else {
board[i][j] = '.';
}
}
}
return false;
}
}
}
return true;
}
void solveSudoku(vector<vector<char>>& board) {
solve(board);
}
};