#include<cstdio>
using namespace std;
int C[20];
bool vis[3][40];
int tot=0;
int n=4;
void search2(int cur)
{
if(cur == n ) tot++;
else for(int i=0;i<n;i++){
if(!vis[0][i]&&!vis[1][cur+i]&&!vis[2][cur-i+n]){

vis[1][cur+i]=vis[2][cur-i+n]=vis[0][i]=1;
search2(cur+1);
vis[1][cur+i]=vis[0][i]=vis[2][cur-i+n]=0;
}

}
}
/*
vis数组用的很巧
实际上就是开了3个一维数组
分别表示已经放置的皇后占据了哪些列
主对角线
副对角线
*/
int main()
{
search2(0);
printf("%d\n",tot);
return 0;
}

下面是优化前

#include<cstdio>


int tot=0;
int C[10];
int n=8;
void search1(int cur)
{
// printf("cur %d n %d\n",cur,n);
if(cur == n){
tot++;
for(int i=0;i<n;i++) printf("%d ",C[i]); printf("\n");
}
else for(int i=0;i<n;i++){
int ok=1;
C[cur]=i;
for(int j=0;j<cur;j++)
if(C[cur]==C[j]||cur-C[cur]==j-C[j]||cur+C[cur]==j+C[j])
{
ok=0;break;
}
if(ok) search1(cur+1);
}
}

int main()


{

tot=0;
search1(0);
printf("%d\n",tot);

return 0;
}