#include <map>
#include <set>
#include <list>
#include <cmath>
#include <ctime>
#include <deque>
#include <queue>
#include <stack>
#include <string>
#include <bitset>
#include <cstdio>
#include <limits>
#include <vector>
#include <climits>
#include <cstring>
#include <cstdlib>
#include <fstream>
#include <numeric>
#include <sstream>
#include <iostream>
#include <algorithm>
#include <unordered_map>

using namespace std;

int n, mat[30][30];
map<pair<int, int>, int> m;
void bt(int x, int y, int a, int b, int k) // br koraka je k
{
    if (k < mat[x][y])
    {
        mat[x][y] = k;
        if (x+a < n && y+b < n) bt(x+a, y+b, a, b, k+1);
        if (x+a < n && y-b >= 0) bt(x+a, y-b, a, b, k+1);
        if (x-a >= 0 && y+b < n) bt(x-a, y+b, a, b, k+1);
        if (x-a >= 0 && y-b >= 0) bt(x-a, y-b, a, b, k+1);
        if (x+b < n && y+a < n) bt(x+b, y+a, a, b, k+1);
        if (x+b < n && y-a >= 0) bt(x+b, y-a, a, b, k+1);
        if (x-b >= 0 && y+a < n) bt(x-b, y+a, a, b, k+1);
        if (x-b >= 0 && y-a >= 0) bt(x-b, y-a, a, b, k+1);
    }
}

int solve(int a, int b)
{
    if (m[make_pair(b, a)] != 0) return m[make_pair(b, a)];
    for(int i = 0; i < n; i++)
        for(int j = 0; j < n; j++)
            mat[i][j] = 10000;
    bt(0, 0, a, b, 0);
    return m[make_pair(a, b)] = (mat[n-1][n-1] != 10000 ? mat[n-1][n-1] : -1);
}

int main()
{
    cin >> n;
    for (int i = 1; i < n; i++)
    {
        for (int j = 1; j < n; j++)
        {
            cout << solve(i, j) << " ";
        }
        cout << endl;
    }
    return 0;
}