#include <iostream>
using namespace std;
const int N=15;
int n,cnt;
int a[N],b[N],c[2*N],d[2*N],arr[N];//a,b,c,d四个数组是分别表示行,列和两条对角线,因为行,列最大为10,那么对角线数组就用2倍行,列存储
void dfs(int k)//k表示行数,i表示列数
{
if(k==n+1)//如果行数等于边数+1(因为当行数等于边数指的是完成皇后安置,这时候进入边数+1,此时为结束时)
{
cnt++;//记录一共有多少种放法
}
for(int i=1;i<=n;i++)
{
if(!a[k]&&!b[i]&&!c[10+k+i]&&!d[10+k-i]) //为什么要10+k+i,10+k-i,保证这两个数(10+k+i,10+k-i)均大于等于0
//为什么10+k+i,10+k-i表示两条对角线,例如4*4的格子中,对于k=1,i=1时,10+k-i=10,那么这条对角线
//k=2,i=2时,10+k-i=10,你可以发现同样等于10,只有满足在这条对角线上的点,k-i始终等于0,所以10+k-i
//始终等于0;同理,10+k+i,表示另一条对角线上的点
{
a[k]=1,b[i]=1,c[10+k+i]=1,d[10+k-i]=1;
dfs(k+1);
a[k]=0,b[i]=0,c[10+k+i]=0,d[10+k-i]=0;
}
}
}
int main()
{
for(n=1;n<=10;n++)
{
cnt=0;
dfs(1);
arr[n]=cnt;
}//因为1到10值是固定的,且比如可能我一直输5,程序要不停地计算当n=5的时候,结果是多少,很可能超时,所以用一个arr数组保存
int a;
while(cin >> a && a)
{
cout << arr[a] << endl;
}
return 0;
}