N-Queens

本题是八皇后问题的拓展,八皇后问题解法是一个经典的回溯算法。实际上是一个深度优先算法。在一个N*N的棋盘上,每一行有且仅有一个皇后,所以N个皇后的坐标可以用一个N元的容器vector<int> colms(n)存放,其中第i行上的皇后的列位置是colms[i]。然后我们深度优先的依次找到满足要求的这n个colms。当我们进行到第r行时,首先在第r行寻找一列位置c,使得在该位置放置皇后后,与之前0~r-1行上已有的皇后不冲突。那么暂且将皇后放置到该位置上,然后递归向下搜索第r+1行,如果找到这n个colms(即r达到n),那么这n个colms位置肯定是可以的。再返回到第r行,再看第r行第c列后面是否有 同样满足的情况。
代码如下:

//判断第r行第c列位置为皇后时,是否与之前r-1行上的皇后冲突
bool checkNoAttack(vector<int> & colms,int r,int c)
{
    for(int i=0;i<r;++i)
    {
        if(colms[i]==c||colms[i]+r==c+i||colms[i]-r==c-i) return false;
    }
    return true;
}

//将每一个格局的棋盘保存成string组
vector<string> chessBoardString(vector<int>& colms)
{
    vector<string> ret;
    int n = colms.size();
    for(int i=0;i<n;++i)
    {
        string lineString = "";
        for(int j=0;j<n;++j)
        {
            lineString+=(j==colms[i]?'Q':'.');
        }
        ret.push_back(lineString);
    }
    return ret;
}
//搜索第i行,DFS算法
void NQueen(vector<int> & colms,int r,vector<vector<string>> &ret)
{
    for(int c = 0;c<colms.size();++c)
    {
        if(checkNoAttack(colms,r,c))
        {
            colms[r]=c;
            if(r==colms.size()-1)
            {
                ret.push_back(chessBoardString(colms));
                return;
            }
            NQueen(colms,r+1,ret);
        }
    }
}

vector<vector<string>> solveNQueens(int n)
{
    vector<int> colms(n,0);
    vector<vector<string>> ret;
    NQueen(colms,0,ret);
    return ret;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值