#include <iostream>
#include <algorithm>
#include <queue>
using namespace std;
int main()
{
    int n;
    cin >> n;
    int arr[n][n];
    bool vis[n][n];
    for(int i = 1; i < n; i++){
        for(int j = 1; j < n; j++){
            for(int k = 0; k < n; k++){
                for(int d = 0; d < n; d++){
                    vis[k][d] = false;
                }
            }
            queue<pair<pair<int, int>, int> > q;
            arr[i][j] = -1;
            vis[0][0] = true;
            q.push(make_pair(make_pair(0, 0), 0));
            while(!q.empty()){
                int r = q.front().first.first;
                int c = q.front().first.second;
                int dist = q.front().second;
                if(r == n - 1 && c == n - 1){
                    arr[i][j] = dist;
                    break;
                }
                q.pop();
                if(r + i < n && c + j < n && !vis[r + i][c + j]){
                    q.push(make_pair(make_pair(r + i, c + j), dist + 1));
                    vis[r + i][c + j] = true;
                }
                if(r + i < n && c - j >= 0 && !vis[r + i][c - j]){
                    q.push(make_pair(make_pair(r + i, c - j), dist + 1));
                    vis[r + i][c - j] = true;
                }
                if(r - i >= 0 && c + j < n && !vis[r - i][c + j]){
                    q.push(make_pair(make_pair(r - i, c + j), dist + 1));
                    vis[r - i][c + j] = true;
                }
                if(r - i >= 0 && c - j >= 0 && !vis[r - i][c - j]){
                    q.push(make_pair(make_pair(r - i, c - j), dist + 1));
                    vis[r - i][c - j] = true;
                }
                if(r + j < n && c + i < n && !vis[r + j][c + i]){
                    q.push(make_pair(make_pair(r + j, c + i), dist + 1));
                    vis[r + j][c + i] = true;
                }
                if(r + j < n && c - i >= 0 && !vis[r + j][c - i]){
                    q.push(make_pair(make_pair(r + j, c - i), dist + 1));
                    vis[r + j][c - i] = true;
                }
                if(r - j >= 0 && c + i < n && !vis[r - j][c + i]){
                    q.push(make_pair(make_pair(r - j, c + i), dist + 1));
                    vis[r - j][c + i] = true;
                }
                if(r - j >= 0 && c - i >= 0 && !vis[r - j][c - i]){
                    q.push(make_pair(make_pair(r - j, c - i), dist + 1));
                    vis[r - j][c - i] = true;
                }
            }
        }
    }
    for(int i = 1; i < n; i++){
        for(int j = 1; j < n; j++){
            cout << arr[i][j] << " ";
        }
        cout << endl;
    }
    return 0;
}