#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& check(vector<vector<int> >& board,int& n,int& x,int& y,int i,int j,int& moves){
    
   // cout<<"x,y "<<x<<","<<y<<endl;
    board[x][y]=1;
    int k=0;
    if(board[n-1][n-1]!=1)
    {   
        
        if(x+j==n-1&&y+i==n-1){k=1;}
        switch(k){
       case 0: if(x+i<n&&y+j<n&&board[x+i][y+j]==0){
           
                x=x+i;y=y+j;
               moves=min(moves,check(board,n,x,y,i,j,++moves));
               
            
            if(board[n-1][n-1]==1){ return moves;}
        }
        else if(x-i>-1&&y+j<n&&board[x-i][y+j]==0){
           
                x=x-i;y=y+j;
                //c2=check(board,n,x,y,i,j,++moves);
                 moves=min(moves,check(board,n,x,y,i,j,++moves));
            if(board[n-1][n-1]==1) {return moves;}
        }
        else if(x+i<n&&y-j>-1&&board[x+i][y-j]==0){
           
                x=x+i;y=y-j;
              //c3=check(board,n,x,y,i,j,++moves);
                 moves=min(moves,check(board,n,x,y,i,j,++moves));
            if(board[n-1][n-1]==1){ return moves;}
        }
        else if(x-i>-1&&y-j>-1&&board[x-i][y-j]==0){
            
                x=x-i;y=y-j;
              // c4=check(board,n,x,y,i,j,++moves);
                moves=min(moves,check(board,n,x,y,i,j,++moves));
            if(board[n-1][n-1]==1) {return moves;}
        }
        
         
        case 1:int temp=i;i=j;j=temp;
       
        if(x+i<n&&y+j<n&&board[x+i][y+j]==0){
            
                
                x=x+i;y=y+j;
               //c5=check(board,n,x,y,i,j,++moves);
                moves=min(moves,check(board,n,x,y,i,j,++moves));
            if(board[n-1][n-1]==1) {return moves;}
        }
        else if(x-i>-1&&y+j<n&&board[x-i][y+j]==0){
           
                x=x-i;y=y+j;
              // c6=check(board,n,x,y,i,j,++moves);
                moves=min(moves,check(board,n,x,y,i,j,++moves));
            if(board[n-1][n-1]==1) {return moves;}
        }
        else if(x+i<n&&y-j>-1&&board[x+i][y-j]==0){
           
                x=x+i;y=y-j;
               //c7=check(board,n,x,y,i,j,++moves);
                moves=min(moves,check(board,n,x,y,i,j,++moves));
            if(board[n-1][n-1]==1) {return moves;}
        }
        else if(x-i>-1&&y-j>-1&&board[x-i][y-j]==0){
            {
                x=x-i;y=y-j;
                 //c8=check(board,n,x,y,i,j,++moves);
               moves=min(moves,check(board,n,x,y,i,j,++moves));
            }
            if(board[n-1][n-1]==1) {return moves;}
        }
    
        else{ moves=32000;}
        }
    }
   // cout<<moves<<endl;
    return moves;
}
int main(){
    int n;
    cin >> n;
    
    int i=3,j=3;
   for(int i=1;i<n;++i){
        for(int j=1;j<n;++j){
            vector<vector<int> > board(n,vector<int>(n,0));
           int move=0,x=0,y=0; 
           auto k=check(board,n,x,y,i,j,move);
           if(board[n-1][n-1]!=1){cout<<-1<<" ";}else{cout<<move<<" ";}
        }
        cout<<"\n";
    }
    return 0;
}