题目 https://leetcode-cn.com/problems/sudoku-solver/
好慢…看了题解,思路是对的,只是判断冲突的方式没有优化
bool isValid(char** board, int boardSize, int* boardColSize,int i,int j){
int ii,jj,count;
char c;
c = board[i][j];
count = 0;
for(ii=0;ii<boardSize;ii++){
if(c == board[ii][j]){
count++;
}
}
if(count>1) return false;
count = 0;
for(jj=0;jj<boardColSize[i];jj++){
if(c == board[i][jj]){
count++;
}
}
if(count>1) return false;
count = 0;
i = i/3*3;
j = j/3*3;
for(ii=i;ii<i+3;ii++){
for(jj=j;jj<j+3;jj++){
if(c == board[ii][jj]){
count++;
}
}
}
if(count>1) return false;
return true;
}
bool doSudoku(char** board, int boardSize, int* boardColSize,int i,int j){
/*
if(i == boardSize){
return true;
}
if(j == boardColSize[i]){
return doSudoku(board,boardSize,boardColSize,i+1,0);
}
if(board[i][j] != '.'){
return doSudoku(board,boardSize,boardColSize,i,j+1);
}
*/
for(;i<boardSize;i++){
for(;j<boardColSize[i] && board[i][j] != '.';j++){
}
if(j == boardSize){
j = 0;
}else{
break;
}
}
if(i == boardSize){
return true;
}
char c;
for(c='1';c<='9';c++){
board[i][j] = c;
if(isValid(board,boardSize,boardColSize,i,j) == true){
if(doSudoku(board,boardSize,boardColSize,i,j+1) == true)
return true;
}
board[i][j] = '.';
}
return false;
}
void solveSudoku(char** board, int boardSize, int* boardColSize){
doSudoku(board,boardSize,boardColSize,0,0);
}