2021.5.9-数独(回溯)
题目链接:https://leetcode-cn.com/problems/sudoku-solver
题目描述:
编写一个程序,通过填充空格来解决数独问题。
数独的解法需 遵循如下规则:
数字 1-9 在每一行只能出现一次。
数字 1-9 在每一列只能出现一次。
数字 1-9 在每一个以粗实线分隔的 3x3 宫内只能出现一次。(请参考示例图)
数独部分空格内已填入了数字,空白格用 '.' 表示。
题解:
题解详解
class Solution {
public:
bool isValid(int row, int col,char val, vector<vector<char>>& board)
{
//校验每行是否重复
for(int i = 0; i < 9; i++)
{
if(board[i][col] == val)
return false;
}
//校验每列是否重复
for(int j = 0; j < 9; j++)
{
if(board[row][j] == val)
return false;
}
//校验3*3宫内是否重复
int minRow = (row / 3) * 3;
int minCol = (col / 3) * 3;
for(int i = minRow; i < minRow + 3; i++)
{
for(int j = minCol; j < minCol + 3; j++)
{
if(board[i][j] == val)
return false;
}
}
return true;
}
bool trackingBack(int row, int col, vector<vector<char>>& board)
{
//迭代到最后一行即结束
if(row == board.size())
return true;
//迭代到最后一列即进入下一行第一列继续
if(col == board[0].size())
return trackingBack(row + 1, 0, board);
//迭代的位置已经有数值,继续向后查找
if(board[row][col] != '.')
return trackingBack(row, col +1 , board);
//找到可放数值位置后,从1-9中选择一个合法值放入
for(char k = '1'; k <= '9'; k++)
{
if(isValid(row, col, k, board))
{
board[row][col] = k;
if(trackingBack(row, col + 1, board))
return true;
board[row][col] = '.';
}
}
return false;
}
void solveSudoku(vector<vector<char>>& board) {
trackingBack(0 , 0, board);
}
};