在8*8的棋盘上摆放8个皇后,使其不能互相攻击,即任意的两个皇后不能处在同意行,同一列,或同意斜线上。可以把八皇后问题拓展为n皇后问题,即在n*n的棋盘上摆放n个皇后,使其任意两个皇后都不能处于同一行、同一列或同一斜线上。
PS:在八个皇后中,每个皇后都不能在同一列或者对角线中,这样每个可以构造出来一个函数
(i!=k || abs(queen[i]-queen[k])!=abs(i-k)) 在最后证明第二个条件满足不在对角线上
思路:
构造一个完全八叉树,每个节点的子节点分为八个,总共有九层,第一层作为父节点。
在条件不满足中,就返回。
代码如下:
#include <iostream>
using namespace std;
void eightQueen(int n)
{
int nLine = 0;
int *queen = new int[n];
memset(queen, 0, n*sizeof(int));
while(nLine >= 0){
queen[nLine]++;
// 找到没有冲突的列
while(queen[nLine] <= n){
int i = 0;
for(i = 0; i < nLine; i++){
if(queen[nLine] == queen[i] || abs(i-nLine) == abs(queen[i]-queen[nLine])){
break;
}
}
if(i < nLine){ // 有冲突
queen[nLine]++;
}else{ //没有发生冲突
break;
}
}
// 最后一行中,且满足没有发生冲突
if(nLine == n-1 && queen[nLine] <= n){
for(int i = 0; i < n; i++){
cout << queen[i] << " ";
}
cout << endl;
}else{
if(queen[nLine] <= n && nLine < n-1){ // 没有发生冲突,但是没有到最后一行
nLine++;
}else{ // 发生冲突,回溯
queen[nLine] = 0;
nLine--;
}
}
}
}
int main(void)
{
eightQueen(4);
return 0;
}