在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;
}