#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;
bool passed[26][26];

#define mp make_pair
typedef pair <int, int> pi;
typedef pair <pi, int> pii;

int n;
bool inrange(int x, int y) {
    return x > 0 && x <= n && y > 0 && y <= n;
}
int bfs(int a, int b) {
    int dx[8] = {-a, -a, a, a, b, b, -b, -b},
        dy[8] = {b, -b, -b, b, a, -a, -a, a};
    memset(passed, 0, sizeof(passed));
    queue <pii> qu;
    pii start = mp(mp(1, 1), 0);
    qu.push(start);
    while (qu.size()) {
        pii cur = qu.front(); qu.pop();
        int steps = cur.second;
        int x = cur.first.first,
            y = cur.first.second;
        if (x == n && y == n) return steps;                    
        for (int i = 0; i < 8; i++) {
            int xx = x + dx[i],
                yy = y + dy[i];
            if (!inrange(xx, yy) || passed[xx][yy]) continue;
            passed[xx][yy] = true;
            qu.push(mp(mp(xx, yy), steps + 1));
        }
    }
    return -1;
}

int main(){    
    cin >> n;
    // your code goes here
    for (int i = 1; i < n; i++) {
        for (int j = 1; j < n; j++) cout << bfs(i, j) << " ";
        cout << "\n";
    }
    return 0;
}