N-Queens

来源:互联网 发布:华为手机root软件 编辑:程序博客网 时间:2024/05/21 17:29

本题是八皇后问题的拓展,八皇后问题解法是一个经典的回溯算法。实际上是一个深度优先算法。在一个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