//1.非递归:
#include <cstdio>
#include <cmath>
using namespace std;
#define N 13
int x[N];
bool isvalid(int k)
{
int i;
for(i=0; i<k; i++)
if(x[i]==x[k] || abs(x[i]-x[k])==abs(i-k))
return false;
return true;
}
int queen(int n)
{
int k=0,count=0;
x[k]=-1;
while(k>=0)
{
x[k]++;
while(x[k]<=n-1 && !isvalid(k))x[k]++;
if(x[k]>n-1)k--;
else if(k==n-1)++count;
else x[++k]=-1;
}
return count;
}
int main()
{
int n,ans[N]= {0};
for(n=1; n<=11; n++)
ans[n]=queen(n);
while(scanf("%d",&n)!=EOF && n)
printf("%d\n",ans[n]);
return 0;
}
//**********************************************//
//2.递归:
#include <cmath>
#include <iostream>
using namespace std;
#define N 12
int n,sum,x[N]= {0}; //x[i]代表第i个皇后的列序号,行序号是下标i
bool isvalid(int i)
{
for(int j=0; j<i; j++)
{
//同一列 || 同一斜线上
if( x[j]==x[i] || abs( x[j] - x[i] ) == i- j)
return false;
}
return true;
}
void print()
{
bool board[N][N]= {0};
for(int i=0; i<n; i++)
board[i][ x[i] ]=true;
for(int i=0; i<n; i++)
{
for(int j=0; j<n; j++)
printf("%d ",board[i][j]);
printf("\n");
}
printf("\n");
}
void dfs(int cur)
{
if(cur==n)
{
sum++;
// print();
}
else
for(int i=0; i<n; i++) //探索第i层(第cur个皇后)的所有列号
{
x[cur]=i;
if( isvalid(cur) )
{
dfs( cur+1 );
//x[cur]=0;
}
}
}
int main()
{
while(scanf("%d",&n) !=EOF )
{
sum=0;
dfs(0);
printf("sum=%d\n",sum);
}
return 0;
}
/*
1=1
2=0
3=0
4=2
5=10
6=4
7=40
8=92
9=352
10=724
*/