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;
    }
};



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值