N-Queen

Q:八皇后问题。DFS

    vector<vector<string> > solveNQueens(int n) {
        // Start typing your C/C++ solution below
        // DO NOT write int main() function
        vector<vector<string> > result;
        if(n<=0)
            return result;
            
        vector<int> positions;
        
        Queens(0,n,positions,result);
        
        return result;
        
    }
    
    
    void Queens(int nrow,int n,vector<int>& positions,vector<vector<string> >& result)
    {
        if(nrow==n)
        {
            printSolution(positions,result);
            return;
        }
        for(int i=0;i<n;i++)
        {
            if(checkvalid(i,positions))
            {
                positions.push_back(i);
                Queens(nrow+1,n,positions,result);
                positions.pop_back();
            }
        }
    }
    
    bool checkvalid(int ncol,vector<int>& positions)
    {
        int rows = positions.size();
        for(int i=0;i<rows;i++)
        {
            if(positions[i]==ncol||rows-i==ncol-positions[i]||rows+ncol==i+positions[i])  //not in the same colomn
                return false;
        }
        
        return true;
        
    }
    
    void printSolution(vector<int>& positions,vector<vector<string> >& result)
    {
        vector<string> solution;
        int n = positions.size();
        for(int i=0;i<n;i++)
        {
            string str = "";
            for(int j=0;j<positions[i];j++)
                str+=".";
            str+="Q";
            for(int j=positions[i]+1;j<n;j++)
                str+=".";
            solution.push_back(str);
        }
        
        result.push_back(solution);
    }

  

posted @ 2013-08-11 16:37  summer_zhou  阅读(156)  评论(0编辑  收藏  举报