lintcode- N皇后问题

n皇后问题是将n个皇后放置在n*n的棋盘上,皇后彼此之间不能相互攻击。

给定一个整数n,返回所有不同的n皇后问题的解决方案。

每个解决方案包含一个明确的n皇后放置布局,其中“Q”和“.”分别表示一个女王和一个空位置。

样例

对于4皇后问题存在两种解决的方案:

[

    [".Q..", // Solution 1

     "...Q",

     "Q...",

     "..Q."],

    ["..Q.", // Solution 2

     "Q...",

     "...Q",

     ".Q.."]

]

class Solution {
    vector<string> base;
    vector<vector<string> > ret;
    
    void search(vector<int> &c,int n,int cur){
        if(n==cur){
            ret.push_back(base);
            return;
        }
        for(int i=0;i<n;++i){       //cur表示当前行,i表示要选择的列
            if(isValid(c,cur,i)){   //检验当前列是否合法
                c[cur]=i;               
                string s(n,'.');   
                s[i]='Q';           //当前位置摆放皇后,那么同一行其他位置全部是'.'
                base.push_back(s);  
                search(c,n,cur+1);  //搜寻下一行
                base.pop_back();    //别忘了弹出,base用于存放下一组可能位置
            }
        }
    }
    bool isValid(vector<int> &c,int row,int col){
        for(int i=0;i<row;++i)
            if(c[i]==col||row-col==i-c[i]||row+col==i+c[i]) //分别检查纵向,主对角线,副对角线上是否有其他皇后
                return false;                               //因为是一行一行摆放,所以不用检查同一行
        return true;        
    }
public:
    
    vector<vector<string> > solveNQueens(int n) {
        if(n<=0)
            return ret;
        vector<int> c(n);
        search(c,n,0);
        return ret;
    }
};



你可能感兴趣的:(lintcode- N皇后问题)