八皇后

同在左下->右上对角线上的坐标,行列序号之和为定值。
同在左上->右下对角线上的坐标,行列序号之差为定值。
所以可以用相同下标的数组表示某一对角线是否被占领。

#include<bits/stdc++.h>
using namespace std;

int n,Count=0;
int r[100]={0},c[100]={0},a[100]={0},b[100]={0};//行列 左上->右下对角线,左下->右上对角线 


void dfs(int i){//查找第i行 
	if(i>n){//找到解 
		if(Count<3){
			for(int j=1;j<=n;j++){
		    	printf("%d ",r[j]);
		    }
	    	cout<<endl;
		}
		Count++;
		return ;
	}
	for(int j=1;j<=n;j++){
		if((!c[j])&&(!a[i-j+n])&&(!b[i+j])){
			r[i]=j;//表示i行第j个占领
			c[j]=1;//j列已经占领
			a[i-j+n]=1;
			b[i+j]=1;//两条对角线占领 
			
			dfs(i+1);//找下一行 
			
			//清空标记,寻找下一组解 
			c[j]=0;
			a[i-j+n]=0;
			b[i+j]=0;
		}
	}
}
int main(){
	cin>>n;
	dfs(1);
	cout<<Count<<endl;
	return 0;
}