问题描述
在n×n的方格棋盘上,放置n个皇后,要求每个皇后不同行、不同列、不同左右对角线。如下图所示是6皇后问题的一个解。
q[1…6]={2,4,6,1,3,5}
代码
int q[MAX];
bool place(int i)//检测当前行是否与原来的棋子有冲突
{
int j = 1;
if (i == 1)
return true;
while (j < i)
{
if ((q[j] == q[i]) || (abs(q[j] - q[i]) == abs(i - j)))
return false;
j++;
}
return true;
}
void Queens(int n)
{
int i = 1;
q[i] = 0;
while (i >= 1)
{
q[i]++;
while (q[i] <= n && !place(i))//试探放置的位置
q[i]++;
if (q[i] <= n)//找寻到放置的位置
{
if (i == n)//所有棋子放置完毕
dispasolution(n);
else//未放置完毕,放置下一行棋子
{
i++;
q[i] = 0;
}
}
else//回溯
i--;
}
}
算法分析
该算法中每个皇后都要试探n列,共n个皇后,其解空间是一棵子集树,不同于前面一般的二叉树子集树,这里每个结点可能有n棵子树。
对应的算法时间复杂度为O(nn)。