Write a program to solve a Sudoku puzzle by filling the empty cells.
Empty cells are indicated by the character ‘.’.
You may assume that there will be only one unique solution.
A sudoku puzzle…
…and its solution numbers marked in red.
class Solution {
public:
bool isValidSudoku(vector<vector<char>>& board)
{
int cnt[10];
for(int i=0; i<9; i++) //每一行
{
memset(cnt, 0, sizeof(cnt));
for(int j=0; j<9; j++)
{
if(board[i][j] != '.')
{
cnt[board[i][j]-'0']++;
if(cnt[board[i][j]-'0'] > 1)
return false;
}
}
}
for(int i=0; i<9; i++) //每一列
{
memset(cnt, 0, sizeof(cnt));
for(int j=0; j<9; j++)
{
if(board[j][i] != '.')
{
cnt[board[j][i]-'0']++;
if(cnt[board[j][i]-'0'] > 1)
return false;
}
}
}
for(int i=0; i<9; i+=3) //每个宫
{
for(int j=0; j<9; j+=3)
{
memset(cnt, 0, sizeof(cnt));
for(int a=i; a<i+3; a++)
{
for(int b=j; b<j+3; b++)
{
if(board[a][b] != '.')
{
cnt[board[a][b]-'0']++;
if(cnt[board[a][b]-'0'] > 1)
return false;
}
}
}
}
}
return true;
}
bool dfs(vector<vector<char>>& board, int depth)
{
if(depth == 81)
{
if(isValidSudoku(board))
return true;
return false;
}
int x = depth / 9;
int y = depth % 9;
if(board[x][y] == '.')
{
for(int i=1; i<10; i++)
{
board[x][y] = i + '0';
if(isValidSudoku(board))
if(dfs(board, depth+1))
return true;
board[x][y] = '.';
}
}
else
if(dfs(board, depth+1))
return true;
return false;
}
void solveSudoku(vector<vector<char>>& board)
{
dfs(board, 0);
}
};