LeetCode:37. 解数独
class Solution {
//标记是否可以找到可行解
bool found=false;
public:
void solveSudoku(vector<vector<char>>& board) {
backtrack(board,0);
}
private:
//index代表数字的位置
void backtrack(vector<vector<char>>& board,int index){
int m=9,n=9;
//i和j代表横纵坐标
int i=index/n,j=index%n;
if(found){
return;
}
if(index==m*n){
found=true;
return;
}
if(board[i][j]!='.'){
//遇到已给出的数,进入下一个位置
backtrack(board,index+1);
return;
}
for(char ch='1';ch<='9';ch++){
if(!isvalid(board,i,j,ch)){
//如果遇到不合适的就跳过
continue;
}
board[i][j]=ch;
backtrack(board,index+1);
if(found){
return;
}
board[i][j]='.';
}
}
bool isvalid(vector<vector<char>>& board,int r,int c,char num){
for(int i=0;i<9;i++){
//判断行内是否出现重复
if(board[r][i]==num)return false;
//判断列内是否出现重复
if(board[i][c]==num)return false;
if(board[(r/3)*3+i/3][(c/3)*3+i%3]==num){
return false;
}
}
return true;
}
};
