#include <stdio.h>
#include <string.h>
#include<iostream>
#include<algorithm>
#pragma warning(disable:4996)
using namespace std;
int k = 0;//计算答案个数
int place[20];//下标表示行,内容表示列
int cow[20];//列
int d1[20];//上对角线标记方法 下标 行 - 列 + 7 内容 为 1 表示 这个对角线被标记
int d2[20];//下对角线标记方法 下标 行 + 列
//回溯的意义在于要求出 所有的解
void print(int n)
{
k++;//能到这里说明有解
if (k <= 3)
{
int i = 0;
for (i = 1; i <= n; i++)//一共n行
{
printf("%d ", place[i]);
}
printf("\n");
}
}
void ans(int h, int n)//h表示行,n表示一共n行
{
int i = 0;
for (i = 1; i <= n; i++)//i表示第i列
{
//已知具体的一个点,该点所在对角线的点的值都有相同的值 行-列+ 7
//那么标记对角线就OK了
//上图
if (cow[i] == 0 && d1[i - h + 7] == 0 && d2[i + h] == 0)//如果h行i列未被标记 说明可以放
{
place[h] = i;//下标表示h行 内容表示 i列
cow[i] = 1;//标记第i列
d1[i - h + 7] = 1;//标记上对角线
d2[i + h] = 1;//标记下对角线
if (h < n)//当不是最后一行的时候,继续探索
{
ans(h + 1, n);
}
else//最后一行打印答案
{
print(n);
}
cow[i] = 0;//回溯
d1[i - h + 7] = 0;
d2[i + h] = 0;
}
}
}
int main()
{
int n = 0;
cin >> n;
ans(1, n);
printf("%d", k);
return 0;
}