【second】N-Queens

回溯法

    vector<vector<string> > solveNQueens(int n) {
        // Note: The Solution object is instantiated only once and is reused by each test case.
        vector<vector<string>> res;
        vector<int> queens;
        vector<bool> cols(n,false);
        vector<bool> diag(2*n,false);
        vector<bool> ardiag(2*n,false);
        
        dfs(0,n,queens,cols,diag,ardiag,res);
        return res;
    }
    
    void dfs(int row,int n,vector<int>& queens,vector<bool>& cols,vector<bool>& diag,vector<bool>& ardiag,vector<vector<string>>& res)
    {
        if(row==n)
        {
           generate(queens,res);
           return; 
        }
        for(int i=0;i<n;i++)
        {
            if(!cols[i]&&!diag[i-row+n]&&!ardiag[i+row])
            {
                cols[i] = diag[i-row+n] = ardiag[i+row] = true;
                queens.push_back(i);
                dfs(row+1,n,queens,cols,diag,ardiag,res);
                cols[i] = diag[i-row+n] = ardiag[i+row] = false;
                queens.pop_back();
            }
        }
    }
    
    void generate(vector<int>& queens,vector<vector<string>>& res)
    {
        int n = queens.size();
        vector<string> tmp(n,string(n,'.'));
        for(int i=0;i<n;i++)
           tmp[i][queens[i]] = 'Q'; 
        res.push_back(tmp);
    }

  

posted @ 2013-10-19 16:54  summer_zhou  阅读(138)  评论(0编辑  收藏  举报