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);
//当前3x3宫格是否已出现过
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);
}
};
LeetCode37. 解数独
最新推荐文章于 2024-08-10 07:14:43 发布