Sudoku Solver

A: 回溯法解决,和八皇后一个思路。

用三个二维数组标记数字在行,列,block是否出现过。

    vector<vector<bool>> row;
    vector<vector<bool>> col;
    vector<vector<bool>> block;
    void solveSudoku(vector<vector<char> > &board) {
        // Start typing your C/C++ solution below
        // DO NOT write int main() function
        row.clear();
        col.clear();
        block.clear();
        
        row.resize(9,vector<bool>(9,false));
        col.resize(9,vector<bool>(9,false));
        block.resize(9,vector<bool>(9,false));
        
        for(int i=0;i<9;i++)
        {
            for(int j=0;j<9;j++)
            {
                if(board[i][j]=='.')
                    continue;
                int num = board[i][j]-'1';
                row[i][num] = col[j][num] = block[(i/3)*3+j/3][num] = true;
            }
        }
        
        dfs(0,board);
        
    }
    
    bool dfs(int pos,vector<vector<char>>& board)
    {
        while(pos<81&&board[pos/9][pos%9]!='.')
        {
            pos++;
        }
        if(pos==81) return true;
        
        int i = pos/9,j=pos%9;
        
        for(int num=0;num<9;num++)
        {
            if(!row[i][num]&&!col[j][num]&&!block[(i/3)*3+j/3][num])
            {
                row[i][num] = col[j][num] = block[(i/3)*3+j/3][num] = true;
                board[i][j] = num+'1';
                if(dfs(pos+1,board))
                    return true;
                board[i][j] = '.';
                row[i][num] = col[j][num] = block[(i/3)*3+j/3][num] = false;
            }
        }
        
        return false;
    }

  

posted @ 2013-09-30 14:03  summer_zhou  阅读(162)  评论(0编辑  收藏  举报