saer
// erg.cpp : 定义控制台应用程序的入口点。
//>
#include "stdafx.h"
#include"omp.h"
int n;
int q;
void dfs(int b[],int k)
{
int i,j;
if(k>n)
{
#pragma omp atomic
q++;
// find=true;
return ;
}
for(i=1;i<=n;i++)
{
for(j=1;j<k;j++)
{
if(i==b[j])//不同列 b[j] 表示第j行用了第b[j] 列
break;
int x1=k-j,x2=i-b[j];
if(x1<0) x1=x1*-1;
if(x2<0) x2=x2*-1;
if(x1==x2) //不能斜着相对
break;
}
if(j<k)
continue;
b[k]=i;
dfs(b,k+1);
}
}
int _tmain(int argc, _TCHAR* argv[])
{
int i;
while(scanf("%d",&n))
{
q=0;
omp_set_num_threads(2);
#pragma omp parallel for
for(i=1;i<=n;i++)
{
int y[20];
y[1]=i;
dfs(y,2);
}
printf("%d\n",q);
}
return 0;
}