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 ‘.’.
编写一个程序,通过已填充的空格来解决数独问题。
一个数独的解法需遵循如下规则:
数字 1-9 在每一行只能出现一次。
数字 1-9 在每一列只能出现一次。
数字 1-9 在每一个以粗实线分隔的 3x3 宫内只能出现一次。
空白格用 ‘.’ 表示。
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.
注意:
给定的数独序列只包含数字 1-9 和字符 ‘.’ 。
你可以假设给定的数独只有唯一解。
给定数独永远是 9x9 形式的。
C++
class Solution {
public:
bool rows[9][9] = {false};
bool cols[9][9] = {false};
bool boxes[9][9] = {false};
void solveSudoku(vector<vector<char>>& board) {
for(int i = 0; i < 9; i++){
for(int j = 0; j < 9; j++){
if(board[i][j] != '.'){
rows[i][ board[i][j] - '1' ] = true;
cols[j][ board[i][j] - '1' ] = true;
boxes[ (i/3)*3 + j/3 ][ board[i][j] - '1' ] = true;
}
}
}
backtrack(board, 0, 0);
}
bool backtrack(vector<vector<char>>& board, int row, int col){
while(board[row][col] != '.'){
col++;
if( col >= 9){
col = 0;
row++;
}
if(row >=9 ){
return true;
}
}
for(int i = 0; i < 9 ; i++){
//限制编程 Constraint Programming
if(rows[row][i] || cols[col][i] || boxes[ (row/3)*3 + col/3 ][i]){
continue;
}
board[row][col] = i + '1';
rows[row][i] = cols[col][i] = boxes[ (row/3)*3 + col/3 ][i] = true;
if(backtrack(board,row,col)){
return true;
}
//回溯 backtrack
else{
rows[row][i] = cols[col][i] = boxes[ (row/3)*3 + col/3 ][i] = false;
board[row][col] = '.';
}
}
return false;
}
};