37. 解数独 Sudoku Solver

题目 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);
}

猜你喜欢

转载自blog.csdn.net/ZRXSLYG/article/details/111304581