#include <iostream>
using namespace std;
int a[10];
int n,ans;
void print()
{
if(ans>3)
return;
else
{
for(int i=1;i<=n;i++)
{
cout<<a[i]<<' ';
}
cout<<endl;
}
}
bool check(int x,int y)
{
for(int i=1;i<=x;i++)
{
if(a[i]==y) return false; //第一种情况就是在同一列内不存在多个皇后
if(a[i]+i==x+y) return false;//负对角线上不能存在多个皇后
if(i-a[i]==x-y) return false;//正对角线也不能存在多个皇后
}
return true;
}
void dfs(int row)
{
if(row==n+1) //此处的相等就是条件 是他能成功的最小边界
{
ans++;
print();
return ;
}
for(int i=1;i<=n;i++)
{
if(check(row,i))
{
a[row]=i;//第row行元素放在第i列
dfs(row+1);//此处需要回溯,因为解决的是共有多少种解
a[row]=0;
}
}
}
int main()
{
cin>>n;
dfs(1);
cout<<ans<<endl;
return 0;
}