#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 valid(int x, int y, int N, int M) {
    if (x < 0 || y < 0 || x >= N || y >= M)
            return false;
    return true;
}
 
int bfs(pair<int, int> p1, pair<int, int> p2, pair<int, int> p3, pair<int, int> p4) {
     
    int N = p3.first;
    int M = p3.second;
    queue<pair<pair<int, int>, int> > Que;
    map<pair<int, int>, bool> Vis;
    
    int dx = p4.first;
    int dy = p4.second;
           
    int ddx[8] = {dx, dx, -dx, -dx, dy, dy, -dy, -dy};
    int ddy[8] = {-dy, dy, dy, -dy, dx, -dx, dx, -dx};
         
    Que.push(make_pair(p1, 0));
 
    while(!Que.empty()) {
        pair<pair<int, int>, int> temp = Que.front();
        
        Que.pop();
 
        if(temp.first.first == p2.first && temp.first.second == p2.second)          
                return temp.second;
        
        int x = temp.first.first;
        int y = temp.first.second;
        int dis = temp.second + 1;
 
        if(Vis.count(make_pair(x, y)))
            continue;
        
        Vis[make_pair(x, y)] = true;
       
        for(int i = 0; i < 8; ++i) {                        
            int x1 = x + ddx[i];
            int y1 = y + ddy[i];            
            if(valid(x1, y1, N, M)) Que.push(make_pair(make_pair(x1, y1), dis));
        }  
    }
 
    return -1;
}
     
int solve(int N, int M, int x1, int y1, int x2, int y2, int dx, int dy) { 
    pair<int, int> p1;
    p1.first = x1; p1.second = y1; 
    
    pair<int, int> p2;
    p2.first = x2; p2.second = y2; 
    
    pair<int, int> p3;
    p3.first = N; p3.second = M; 
    
    pair<int, int> p4;
    p4.first = dx; p4.second = dy;     
    
    return bfs(p1, p2, p3, p4);
}


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 moves = solve(n, n, 0, 0, n-1, n-1, i, j);
            cout << moves;
            if (j!=n-1) cout << " "; else cout << endl;
        }
    }
    
    return 0;
}