#include <iostream>
#include <string>
#include <cstdio>
#include <cstdlib>
#include <algorithm>
#include <map>
#include <cmath>
#include <vector>
#include <queue>
#include <iomanip>
#include <set>
#include <stdio.h>
#include <string.h>
 
using namespace std;
 
const int N6 = 1e6 + 6;
const int N9 = 1e9 + 7;
 
typedef unsigned long long ull;
typedef long long ll;
typedef double ld;
typedef pair <int, int> PII;
typedef pair <int, ll> PIl;
typedef pair <ll, int> PlI;
typedef pair <ll, ll> Pll;
 
#define F first
#define S second
#define pb push_back
#define p push
#define mp make_pair
#define re(x, a) for (__typeof(a) x = 1; x <= a; ++x)
#define reo(x, a) for (__typeof(a) x = 1; x <= a; ++x)
#define rep(x, a) for (__typeof(a) x = 1; x <= a; ++x)
#define erp(x, a) for (__typeof(a) x = 1; x <= a; ++x)
#define repp(x, a) for (__typeof(a) x = 0; x < a; ++x)
#define epo(x, a) for (__typeof(a) x = 1; x <= a; ++x)
#define itn int
#define for1(x, a, b) for (int x = b; x >= a; --x)
#define sz(x) (int)x.size()
#define siz size
#define skip continue
#define gg exit(0)
#define boost ios_base::sync_with_stdio(0),cin.tie(NULL)
#define task "A"
 
const ll N = 1e5 + 200;
const int INF = (int)1e9 + 100;
const ll mod = 1e9 + 7;
const ll BLOCK = 316;

int n,dem,d[1111];

map< pair< int, int >, int > cnt;

vector<int>g[1111];

int main(){

  // #ifndef ONLINE_JUDGE

  // #endif

  boost;

  cin >> n;

  for(int i = 1; i <= n; ++i){
    for(int j = 1; j <= n; ++j){
      cnt[mp(i,j)] = ++dem;
    }
  }


  for(int i = 1; i < n; ++i){
    for(int j = 1; j < n; ++j){

      for(int ii = 1; ii <= dem; ++ii)
        g[ii].clear();

      for(int ii = 1; ii <= n; ++ii){
        for(int jj = 1; jj <= n; ++jj){
          if( ii + i <= n && jj + j <= n ){
            g[cnt[mp(ii,jj)]].pb(cnt[mp(ii+i,jj+j)]);
            g[cnt[mp(ii+i,jj+j)]].pb(cnt[mp(ii,jj)]);
          }
          if( ii + j <= n && jj + i <= n ){
            g[cnt[mp(ii,jj)]].pb(cnt[mp(ii+j,jj+i)]);
            g[cnt[mp(ii+j,jj+i)]].pb(cnt[mp(ii,jj)]);
          }
          if( ii + i <= n && jj - j >= 1 ){
            g[cnt[mp(ii,jj)]].pb(cnt[mp(ii+i,jj-j)]);
            g[cnt[mp(ii+i,jj-j)]].pb(cnt[mp(ii,jj)]);
          }
          if( ii + j <= n && jj - i >= 1 ){
            g[cnt[mp(ii,jj)]].pb(cnt[mp(ii+j,jj-i)]);
            g[cnt[mp(ii+j,jj-i)]].pb(cnt[mp(ii,jj)]);
          }
          if( ii - i >= 1 && jj + j <= n ){
            g[cnt[mp(ii,jj)]].pb(cnt[mp(ii-i,jj+j)]);
            g[cnt[mp(ii-i,jj+j)]].pb(cnt[mp(ii,jj)]);
          }
          if( ii - j >= 1 && jj + i <= n ){
            g[cnt[mp(ii,jj)]].pb(cnt[mp(ii-j,jj+i)]);
            g[cnt[mp(ii-j,jj+i)]].pb(cnt[mp(ii,jj)]);
          }
          if( ii - i >= 1 && jj - j >= 1 ){
            g[cnt[mp(ii,jj)]].pb(cnt[mp(ii-i,jj-j)]);
            g[cnt[mp(ii-i,jj-j)]].pb(cnt[mp(ii,jj)]);
          }
          if( ii - j >= 1 && jj - i >= 1 ){
            g[cnt[mp(ii,jj)]].pb(cnt[mp(ii-j,jj-i)]);
            g[cnt[mp(ii-j,jj-i)]].pb(cnt[mp(ii,jj)]);
          }
        }
      }

      set< pair<int,int> > s;
      for(int ii = 1; ii <= dem; ++ii)
        d[ii] = 999999999;
      d[1] = 0;
      s.insert(mp(0,1));

      while( !s.empty() ){

        int v = s.begin() -> second;
        s.erase(s.begin());

        repp(ii,sz(g[v])){
          int to = g[v][ii];
          if( d[to] > d[v] + 1 ){
            s.erase(mp(d[to],to));
            d[to] = d[v] + 1;
            s.insert(mp(d[to],to));
          }
        }

      }

      if( (d[dem] - d[1]) ==  999999999 )
        cout << -1 << ' ';
      else 
        cout << d[dem] - d[1] << ' ';


    }
    cout << '\n';
  }

  

  return 0;
}