#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 main(){
    int n;
    cin >> n;
    // your code goes here
    for (int i = 1; i < n; i++) {
        for (int j = 1; j < n; j++) {
            int dist[26][26];
            memset(dist, -1, sizeof(dist));
            int q[26 * 26], sz = 0;
            q[sz++] = 0;
            dist[0][0] = 0;
            for (int s = 0; s < sz; s++) {
                int r = q[s] / n, c = q[s] % n;
                for (int a = -1; a < 2; a += 2) {
                    for (int b = -1; b < 2; b += 2) {
                        int nr = r + a * i;
                        int nc = c + b * j;
                        if (nr < 0 || nr >= n || nc < 0 || nc >= n || dist[nr][nc] != -1) {
                            continue;
                        }
                        dist[nr][nc] = dist[r][c] + 1;
                        q[sz++] = nr * n + nc;
                    }
                }
                for (int a = -1; a < 2; a += 2) {
                    for (int b = -1; b < 2; b += 2) {
                        int nr = r + a * j;
                        int nc = c + b * i;
                        if (nr < 0 || nr >= n || nc < 0 || nc >= n || dist[nr][nc] != -1) {
                            continue;
                        }
                        dist[nr][nc] = dist[r][c] + 1;
                        q[sz++] = nr * n + nc;
                    }
                }
            }
            cout << dist[n - 1][n - 1] << " ";
        }
        cout << endl;
    }
    return 0;
}