题目描述:
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 93x3
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
.
class Solution {
public:
void solveSudoku(vector<vector<char>>& board) {
bool result=can_solve(board);
}
bool can_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++)
{
// 回溯最重要的步骤,让当前格子尝试所有可能的数字,如果发现一个数字不可行
// 改回原来的'.',再尝试其他数字,一旦发现可行的方法直接返回true
if(is_valid(board,i,j,c))
{
board[i][j]=c;
if(can_solve(board)) return true;
else board[i][j]='.';
}
}
return false; // 当一个格子尝试了所有的数字都不行时,返回false
}
}
}
return true; // 当每个点都遍历过,而且存在一种组合方式使得所有的格子内都放置了合法数字,返回true
}
bool is_valid(vector<vector<char>>& board, int i, int j, char c)
{ // 判断在(i,j)处放置c是否合法
for(int k=0;k<9;k++)
{
if(board[k][j]=='.') continue;
else if(board[k][j]==c) return false;
}
for(int k=0;k<9;k++)
{
if(board[i][k]=='.') continue;
else if(board[i][k]==c) return false;
}
int x=i-(i%3), y=j-(j%3);
for(int k=x;k<x+3;k++)
{
for(int l=y;l<y+3;l++)
{
if(board[k][l]=='.') continue;
else if(board[k][l]==c) return false;
}
}
return true;
}
};