#include<bits/stdc++.h>
using namespace std;
int has[25],a[200005],ans=1000000,n;
bool check(int i,int j)
{
    if(i>=0 && i<n && j>=0 && j<n)
        return 1;
    return 0;
}
#define F first
#define S second
int main()
{
    cin>>n;
    for(int i=1;i<n;++i)
    {
        for(int j=1;j<n;++j)
        {
            int vis[26][26];
            memset(vis,0,sizeof(vis));
            //ans=doit(i,j,0,0,vis);
            queue<pair<pair<int,int>,int> >q;
            q.push({{0,0},0});
            int dis[26][26];
            for(int i=0;i<26;++i)
            {
                for(int j=0;j<26;++j)
                {
                    dis[i][j]=1e6;
                }
            }
            dis[0][0]=0;
            while(!q.empty())
            {
                pair<pair<int,int>,int> p=q.front();
                q.pop();
                if(p.F.F==n-1 && p.F.S==n-1)
                    break;
                if(vis[p.F.F][p.F.S])
                    continue;
                vis[p.F.F][p.F.S]=1;
                int x=p.F.F,y=p.F.S,di=p.S;
                //cout<<i<<" "<<j<<" "<<x<<" "<<y<<" "<<di<<endl;
                int dx[]={i,i,-i,-i,j,j,-j,-j};
                int dy[]={j,-j,j,-j,i,-i,i,-i};
                for(int i=0;i<8;++i)
                {
                    if(check(x+dx[i],y+dy[i]) && !vis[x+dx[i]][y+dy[i]] && dis[x+dx[i]][y+dy[i]]>di+1)
                    {
                        q.push({{x+dx[i],y+dy[i]},di+1});
                        dis[x+dx[i]][y+dy[i]]=di+1;
                    }
                }
                
            }
            if(dis[n-1][n-1]!=1000000)
                printf("%d ",dis[n-1][n-1]);
            else
                printf("-1 ");
        }
        printf("\n");
    }


   return 0; 
}