//KomorGiaoGiao
#include <iostream>
#include <iomanip>
#include <algorithm>
#include <climits>
#include <vector>
#include <stack>
#include <cstring>
#include <map>
#include <cmath>
#include <queue>
#define IOS ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
#define N 1010
#define ll long long
#define mx INT_MAX
using namespace std;
int n;
struct moxi
{
string s;
}ans[100010];
//储存答案
int solutions=0;
int queen[20];//储存第i行的皇后在的列数
int dui1[20],dui2[20];//储存两条对角线
int lie[20];
void dfs(int row)//排数
{
if(row==n)
{
for(int i=0;i<n;i++)
{
ans[solutions].s+=queen[i]+1+'0';
ans[solutions].s+=" ";
}
solutions++;
return ;
}
for(int col=0;col<n;col++)//循环列数
{
if(!lie[col]&&!dui1[col+row]&&!dui2[n+row-col])//如果这个地方能放棋子
{
queen[row]=col;//标志着这一行被占领
int a=row+col,b=n+row-col;
lie[col]=1,dui1[a]=1,dui2[b]=1;
dfs(row+1);
lie[col]=0,dui1[a]=0,dui2[b]=0;
}
}
}
bool cmp(moxi a,moxi b)
{
return a.s<b.s;
}
//用于按照字典序输出
int main()
{
IOS
int t=1;
//cin>>t;
while(t--)
{
cin>>n;
dfs(0);
sort(ans,ans+solutions,cmp);
for(int i=0;i<min(3,solutions);i++)
cout<<ans[i].s<<endl;
cout<<solutions<<endl;
}
return 0;
}
大佬们求调