leetcode 37. 解数独
编写一个程序,通过填充空格来解决数独问题。
一个数独的解法需遵循如下规则:
数字 1-9 在每一行只能出现一次。
数字 1-9 在每一列只能出现一次。
数字 1-9 在每一个以粗实线分隔的 3x3 宫内只能出现一次。
空白格用 ‘.’ 表示。
一个数独。
答案被标成红色。
提示:
给定的数独序列只包含数字 1-9 和字符 ‘.’ 。
你可以假设给定的数独只有唯一解。
给定数独永远是 9x9 形式的。
递归三部曲
1.参数和返回值:输入一个二位数组表示数独,返回当前填充后的数独是否合法
2.单层递归逻辑:遍历二维数组,找到待填的位置,然后将1–9分别带入进去看是否合法
3.终止条件:当数独所有元素全部被填满且满足数独定义退出
bool isValid(vector<vector<char>>& board, char target, int row, int column)
{
//判断当前行和列
for(int i = 0; i < 9; i++)
if(board[row][i] == target || board[i][column] == target)
return false;
//判断当前的九宫格
int x = (row / 3) * 3;
int y = (column / 3) * 3;
for(int i = x ; i < x + 3; i++)
{
for(int j = y; j < y + 3; j++)
{
if(board[i][j] == target)
{
return false;
}
}
}
return true;
}
bool backTrace(vector<vector<char>>& board)
{
for(int i = 0; i < 9; i++)
{
for(int j = 0; j < 9; j++)
{
if(board[i][j] != '.') continue;
for(char c = '1'; c <= '9'; c++)
{
if(isValid(board, c, i, j))
{
board[i][j] = c;
if(backTrace(board)) return true;
board[i][j] = '.';
}
}
//当前位置九个数都不满足,退出当前递归层
return false;
}
}
return true;
}
void solveSudoku(vector<vector<char>>& board) {
backTrace(board);
}