#include <bits/stdc++.h>
#define LL long long
#define L long
#define I int
#define FOR(i,s,n) for(int i=s;i<n;i++)
#define FORR(i,n,s) for(int i=n-1;i>=s;i--)
#define max_size_segTree(n) 2*(int)pow(2, (int)(ceil(log2(n)))) - 1
#define m(a,b) memset(a,b,sizeof(a))
#define mp make_pair
#define pb push_back
#define MAX 1000000007
#define INF 1e18+1
using namespace std;
I visited[27][27] = {0};
I one,two;
I n;
void dfs(I pos1, I pos2, I go){
    if(pos1 <= 0 || pos1 > n || pos2 <= 0 || pos2 > n){
        //cout<<"coming";
        return;
    }
    //cout<<pos1<<" "<<pos2<<" ";
    //cout<<visited[pos1][pos2]<<endl;
    if(visited[pos1][pos2] == 0 || visited[pos1][pos2] > go){
        visited[pos1][pos2] = go;
        //cout<<"calling with"<<pos1+one<<" "<<pos2+two<<endl;
        dfs(pos1+one, pos2+two, go+1);
        //cout<<"call1"<<endl;
        dfs(pos1+one, pos2-two, go+1);
        //cout<<"call2"<<endl;
        dfs(pos1-one, pos2+two, go+1);
        //cout<<"call3"<<endl;
        dfs(pos1-one, pos2-two, go+1);
        //cout<<"call4"<<endl;
        
        dfs(pos1+two, pos2+one, go+1);
        dfs(pos1+two, pos2-one, go+1);
        dfs(pos1-two, pos2+one, go+1);
        dfs(pos1-two, pos2-one, go+1);
    }
}
int main()
{
    cin>>::n;
    FOR(i,1,n){
        FOR(j,1,n){
            FOR(l,0,n+1){
                FOR(m,0,n+1){
                    visited[l][m] = 0;
                }
            }
            ::one = i;
            ::two = j;
            dfs(1,1,1);
            cout<<visited[n][n]-1<<" ";
        }
        cout<<endl;
    }
    return 0;
}