#include<bits/stdc++.h>
using namespace std;

const int MAX=30;
int val[MAX][MAX];
bool visited[MAX][MAX];
const int inf=1e9;
int n;

const int dx[]= {1,-1,1,-1,1,-1,1,-1};
const int dy[]= {1,1,-1,-1,1,1,-1,-1};

bool valid(int i,int j)
{
    if(i<=0||i>n||j<=0||j>n)
        return false;
    return true;
}

int ans(int i,int j)
{
    fill(val[0],val[MAX-1]+MAX,inf);
    fill(visited[0],visited[MAX-1]+MAX,false);
    queue<pair<int,int> >q;
    q.push(make_pair(1,1));
    val[1][1]=0;
    while(!q.empty())
    {
        pair<int,int>temp=q.front();
//cout<<temp.first<<" "<<temp.second<<endl;
        q.pop();
        if(temp.first==n&&temp.second==n)
            break;
        if(visited[temp.first][temp.second])
            continue;
        visited[temp.first][temp.second]=true;
        for(int k=0; k<8; k++)
        {
            int x=temp.first;
            int y=temp.second;
            int a=i;
            int b=j;
            if(k>=4)
                swap(a,b);
            int nx=x+dx[k]*a;
            int ny=y+dy[k]*b;
            if(valid(nx,ny)&&val[nx][ny]>1+val[x][y])
            {
                q.push(make_pair(nx,ny));
                val[nx][ny]=1+val[x][y];
            }
        }
    }
    if(val[n][n]==inf)
        return -1;
    return val[n][n];
}

int main()
{
    ios_base::sync_with_stdio(false);
    cin>>n;
    for(int i=1; i<n; i++)
    {
        for(int j=1; j<n; j++)
            cout<<ans(i,j)<<" ";
        cout<<endl;
    }
    return 0;
}