Empty cells are indicated by the character '.'
.
A sudoku puzzle...
class Solution {
public:
void solveSudoku(vector<vector<char>>& board) {
solve(board,0);
}
// 试凑这种 方法 深度优先变量方法
bool solve(vector<vector<char> > &board,int num){
if(num==81){ // 说明到头了
return 1;
}
int m=num/9;
int n=num%9;
// 分2两部分 有数字的
if(board[m][n]!='.'){ // 数字的话继续搜索
if(solve(board,++num)){
return true;
}
return false;
}
// 如果不是数字 就试凑
for(int c='1';c<='9';++c){
if(!isvalid(board,m,n,c)){ // 先判断是否重复
continue; // 试凑失败就继续
}
board[m][n]=c; // 切记不能先放到里面去 ,先放到里面肯定重复啊
if(solve(board,num+1)){
return true;
}
//表示进行回溯
board[m][n]='.';
}
return false; // 最后 数字和. 都不能匹配 就直接返回false 了
}
// 在那个小的9方格中 是否 满足 以及行列
bool isvalid(vector<vector<char> > &board,int m,int n,char ch){
for(int i=0;i<9;++i){ // 对应行列 判断
if(board[m][i]==ch){
return false;
}
if(board[i][n]==ch){
return false;
}
}
// 找9方格 就先要找到开始位置(4,5)
int tm=m/3;
int tn=n/3;
int bm=tm*3; // 方格开始位置
int bn=tn*3;
for(int i=bm;i<bm+3;++i){
for(int j=bn;j<bn+3;++j){
if(board[i][j]==ch){
return false;
}
}
}
return true;
}
};