class Solution {
public:
void getPos(int& x, int& y, int row, int col)
{
double tempX = (double)row / 2;
double tempY = (double)col / 2;
if (tempX <= 1)
x = 1;
else if (tempX <= 2.5)
x = 2;
else if (tempX <= 4)
x = 3;
if (tempY <= 1)
y = 1;
else if (tempY <= 2.5)
y = 2;
else if (tempY <= 4)
y = 3;
}
bool isValid(char i, int row, int col, vector<vector<char>>& board)
{
for (int j = 0; j < 9; j++)
{
if (board[row][j] == i)
return false;
}
for (int j = 0; j < 9; j++)
{
if (board[j][col] == i)
return false;
}
int x, y;
getPos(x, y, row, col);
for (int m = (x - 1) * 3; m < x * 3; m++)
{
for (int n = (y - 1) * 3; n < y * 3; n++)
{
if (board[m][n] == i)
return false;
}
}
return true;
}
bool backtrack(vector<vector<char>>& board)
{
for (int row = 0; row < 9; row++)
{
for (int col = 0; col < 9; col++)
{
if (board[row][col] != '.')
continue;
for (char i = '1'; i <= '9'; i++)
{
if (isValid(i, row, col, board))
{
board[row][col] = i;
if (backtrack(board))
return true;
board[row][col] = '.';
}
}
return false;
}
}
return true;
}
void solveSudoku(vector<vector<char>>& board)
{
backtrack(board);
}
};