您的位置:首页 > 产品设计 > UI/UE

N-Queens

2016-04-07 16:52 274 查看
本题是八皇后问题的拓展,八皇后问题解法是一个经典的回溯算法。实际上是一个深度优先算法。在一个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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: