#include<cstdio> #include<cstring> #include<algorithm> #include<queue> using namespace std; #define fi first #define se second #define mp make_pair #define INF (int)1e9 int ans[30][30]; int mo[30][30]; int main() { int n; scanf("%d", &n); for(int i=1;i<n;i++) { for(int j=i;j<n;j++) { //memset for(int ii=0;ii<n;ii++) for(int jj=0;jj<n;jj++) mo[ii][jj]=INF; queue<pair<int, pair<int, int> > > q; q.push(mp(0,mp(0,0))); mo[0][0]=0; while(!q.empty()) { int curi=q.front().fi, curj=q.front().se.fi, curm=q.front().se.se; q.pop(); if(curi==n-1 && curj==n-1) { ans[i][j]=ans[j][i]=curm; break; } for(int k=-1;k<=1;k+=2) { for(int l=-1;l<=1;l+=2) { int ni=curi+k*i, nj=curj+l*j; if(0<=ni && ni<n && 0<=nj && nj<n && curm+1<mo[ni][nj]) { mo[ni][nj]=curm+1; q.push(mp(ni,mp(nj,curm+1))); } ni=curi+k*j, nj=curj+l*i; if(0<=ni && ni<n && 0<=nj && nj<n && curm+1<mo[ni][nj]) { mo[ni][nj]=curm+1; q.push(mp(ni,mp(nj,curm+1))); } } } } } } for(int i=1;i<n;i++) { for(int j=1;j<n;j++) { if(ans[i][j]==0) printf("-1"); else printf("%d", ans[i][j]); if(j+1<n) printf(" "); else printf("\n"); } } return 0; }