#include using namespace std; //高速化 struct ponjuice{ponjuice(){cin.tie(0);ios::sync_with_stdio(0);cout<= 0; i--) #define per2(i, n) for(ll i = n-1; i >= 0; i--) #define per3(i, a, b) for(ll i = b-1; i >= a; i--) #define per4(i, a, b, step) for(ll i = b-1; i >= a; i-= step) #define per(...) overload4(__VA_ARGS__, per4, per3, per2, per1)(__VA_ARGS__) //関数 #define all(x) (x).begin(), (x).end() #define rall(x) (x).rbegin(), (x).rend() templateinline bool chmax(S& a, T b){return a < b && ( a = b , true);} templateinline bool chmin(S& a, T b){return a > b && ( a = b , true);} //定数 constexpr ll mod = 998244353; constexpr ll minf=-(1<<29); constexpr ll inf=(1<<29); constexpr ll MINF=-(1LL<<60); constexpr ll INF=(1LL<<60); const int dx[4] ={-1, 0, 1, 0}; const int dy[4] ={ 0, 1, 0,-1}; const int dx8[8] ={-1,-1,-1, 0, 1, 1, 1, 0}; const int dy8[8] ={-1, 0, 1, 1, 1, 0,-1,-1}; void solve(); int main() { int t = 1; // cin >> t; while(t--)solve(); } void solve(){ int n; cin >> n; vector> ans(n, vector(n, 0)); int od = 0; per(i,0,n) { ans[0][i] = (od?-1:1)* (n-1-i); od^=1; } od = 0; per(i,1,n) { ans[i][0] = (od?-1:1)* (n-i); od^=1; } rep(i,1,n) { rep(j,1,n) { ans[i][j] = -(ans[i][j-1] + ans[i-1][j] + ans[i-1][j-1]); } } vector>> p(n*2+10); rep(i,1,n+1) { rep(j,1,n+1) { p[i-j+n].push_back({i, j}); } } vector> aa(n, vector(n)), ab = aa; rep(i,0,n) { rep(j,0,n) { aa[i][j] = p[ans[i][j]+n].back()[0]; ab[i][j] = p[ans[i][j]+n].back()[1]; p[ans[i][j]+n].pop_back(); } } for(auto a: aa) { for(auto x: a) cout << x << " "; cout << endl; } for(auto a: ab) { for(auto x: a) cout << x << " "; cout << endl; } }