#include<iostream>
using namespace std;
bool vis[3][30];//记忆数组判断列,主对角线,副对角线是否被占
int ans=0,n;
void dfs(int cur)
{
if(cur==n+1)//如果当前行数超过8(表明八个皇后已经放好)则结果加一,返回继续递归
{
ans++;
return ;
}
//vis[0][i]判断列,vis[i][cur-i+8]判断主对角线,vis[2][cur+i]判断副对角线
for(int i=1;i<=n;i++)if(!vis[0][i]&&!vis[1][cur-i+n]&&!vis[2][cur+i])
{
vis[0][i]=vis[1][cur-i+n]=vis[2][cur+i]=true;
dfs(cur+1);//深度搜索
vis[0][i]=vis[1][cur-i+n]=vis[2][cur+i]=false;
}
}
int main()
{
n;
while(cin>>n,n)
{
dfs(1);//初始化cur为1,即从第一行开始
cout<<ans<<endl;
}
return 0;
}
using namespace std;
bool vis[3][30];//记忆数组判断列,主对角线,副对角线是否被占
int ans=0,n;
void dfs(int cur)
{
if(cur==n+1)//如果当前行数超过8(表明八个皇后已经放好)则结果加一,返回继续递归
{
ans++;
return ;
}
//vis[0][i]判断列,vis[i][cur-i+8]判断主对角线,vis[2][cur+i]判断副对角线
for(int i=1;i<=n;i++)if(!vis[0][i]&&!vis[1][cur-i+n]&&!vis[2][cur+i])
{
vis[0][i]=vis[1][cur-i+n]=vis[2][cur+i]=true;
dfs(cur+1);//深度搜索
vis[0][i]=vis[1][cur-i+n]=vis[2][cur+i]=false;
}
}
int main()
{
n;
while(cin>>n,n)
{
dfs(1);//初始化cur为1,即从第一行开始
cout<<ans<<endl;
}
return 0;
}