#include<bits/stdc++.h>
using namespace std;
const int MAX = 110;
int a[MAX][MAX],ver[MAX],L[2*MAX],R[2*MAX]; ///ver表示竖线,L表示左斜线,R表示右斜线
int ans = 0;
void print(int n){
for(int i = 0;i<n;i++){
for(int j = 0;j<n;j++)
printf("%d ",a[i][j]);
printf("\n");
}
printf("\n");
}
void search_queen2(int i ,int n){
if(i==n){ ///放完一种皇后,即一种情况完成
ans++;
print(n);
return ;
}
for(int j = 0;j<n;j++){
if(!ver[j] && !L[i-j+n] && !R[i+j]){ ///表示可以放置皇后
a[i][j] = i+1; ///表示第几个皇后
ver[j] = L[i-j+n] = R[i+j] = 1;
search_queen2(i+1,n); ///继续递归试探
a[i][j] = 0; ///试探完成后的回退
ver[j] = L[i-j+n] = R[i+j] = 0;
}
}
}
void search_queen(int i ,int n){
for(int j = 0;j<n;j++){
if(!ver[j] && !L[i-j+n] && !R[i+j]){ ///表示可以放置皇后
a[i][j] = i+1; ///表示第几个皇后
ver[j] = L[i-j+n] = R[i+j] = 1;
if(i==n-1){ ///放完一种皇后,即一种情况完成
ans++;
print(n);
}
else
search_queen(i+1,n); ///继续递归试探
a[i][j] = 0; ///试探完成后的回退
ver[j] = L[i-j+n] = R[i+j] = 0;
}
}
}
int main(){
int n ;
cin >> n;
search_queen2(0,n); ///小标从零开始
printf("%d皇后排列种类数为:%d\n",n,ans);
}