编写一个程序,通过填充空格来解决数独问题。
数独的解法需 遵循如下规则:
数字 1-9 在每一行只能出现一次。
数字 1-9 在每一列只能出现一次。
数字 1-9 在每一个以粗实线分隔的 3x3 宫内只能出现一次。(请参考示例图)
数独部分空格内已填入了数字,空白格用 '.' 表示。
思路:1、题目中提到只有一个符合条件的结果,也就是说一旦找到符合的就返回,无需遍历完整个树,用bool作为返回值;
2、3*3的格子依据是将9*9划分成9块区域;
3、不需要写终止条件的原因我觉得是对于这块9*9的区域,已经用i,j的方法去遍历了,找完了都不符合就false,找到符合的就return true,如果9*9的格子遍历完了也没有返回false,于是返回true。
class Solution {
public:
bool isValid(int row,int col,char k,vector<vector<char>>& board){
//检验行是否符合规则
for(int i=0;i<9;i++)
{
if(board[row][i]==k) return false;
}
//检验列是否符合规则
for(int i=0;i<9;i++)
{
if(board[i][col]==k) return false;
}
//检验3*3宫内是否符合规则
//将这个9*9的board划分成9个3*3的
int x=row/3,y=col/3;
for(int i=x*3;i<x*3+3;i++)
{
for(int j=y*3;j<y*3+3;j++)
{
if(board[i][j]==k) return false;
}
}
return true;
}
bool backtracking(vector<vector<char>>& board){
//终止条件 不需要的原因是找不到'.'自然就结束了
//处理 对这个9*9的空间处理
for(int i=0;i<9;i++)
{
for(int j=0;j<9;j++)
{
if(board[i][j]=='.')
{
for(char k='1';k<='9';k++)
{
if(isValid(i,j,k,board))
{
board[i][j]=k;
if(backtracking(board)) return true;
board[i][j]='.';
}
}
return false;
}
}
}
//9*9的格子遍历完了也没有返回false,于是返回true
return true;
}
void solveSudoku(vector<vector<char>>& board) {
backtracking(board);
}
};