//N皇后问题
#include<stdio.h>
#include<stdlib.h>
#include<algorithm>
#include<cmath>
using namespace std;
#define N 8//皇后个数
int ans=0;
int a[N]={0};//a[i]=j表示在第i行的第j列放置
bool check0(int i,int j,int a_i,int a_j){//判断两个位置是否相邻,相邻则返回true ,因为是按行排列的 所以不用考虑同行的情况
if(a_i==a_j) return true;//放在同一列
if(fabs(j-i)==fabs(a_i-a_j)) return true;//放在同对角线(主对角线or次对角线)
return false;
}
bool check(int i,int j){//判断a[i]=j是否不和前面几行冲突
for(int k=0;k<i;k++){
if(check0(k,i,a[k],j))
return true;
}
return false;//不冲突 可以放
}
void dfs(int n){//确定第n行应填的位置
if(n==N) {
ans++;
printf("a[]: ");
for(int i=0;i<N;i++){
printf("%d ",a[i]);
}
printf("\n");
return;
}
for(int i=0;i<N;i++){//从第0列开始试探
a[n]=i;//假设放在第i列
if(check(n,i)) continue;
dfs(n+1);
}
}
int main(){
dfs(0);
printf("共有%d种解法\n",ans);
return 0;
}