import java.io.*;
import java.util.*;
import java.text.*;
import java.math.*;
import java.util.regex.*;

public class Backtracking_knight {
static int n;
static ArrayList<Integer> paths; 
    public static void main(String[] args) {
        
        Scanner in = new Scanner(System.in);
        n = in.nextInt();
        for(int i=1;i<n;i++){
            for(int j=1;j<n;j++){
                boolean[][] grid=new boolean[n][n];
                grid[0][0]=true;
                paths=new ArrayList<Integer>();
                if(!start(grid,0,0,i,j,0))
                    System.out.print(-1+" ");
                else{
                    int min=paths.get(0);
                    for(int a:paths){
                        if(a<min)
                            min=a;
                    }
                    System.out.print(min+" ");

                        
                }
            }
            System.out.println();
        }
    }
 
    public static boolean start(boolean[][] grid,int x,int y,int i,int j,int moves){
        if(grid[n-1][n-1]){
            paths.add(moves);
            grid[n-1][n-1]=false;
            return true;
        }
            
        int next_x,next_y;
        int[] xmove={i,i,-i,-i,j,j,-j,-j};
        int[] ymove={j,-j,j,-j,i,-i,i,-i};
        for(int k=0;k<xmove.length;k++){
            next_x=x+xmove[k];
            next_y=y+ymove[k];
            if(isSafe(next_x,next_y,grid)){
                grid[next_x][next_y]=true;
                start(grid,next_x,next_y,i,j,moves+1);
                    grid[next_x][next_y]=false;
                    
            }
        }
        if(!paths.isEmpty())
        	return true;
        return false;
        
       
    }
    static boolean isSafe(int x, int y, boolean sol[][]) {
        return (x >= 0 && x < n && y >= 0 &&
                y < n && sol[x][y] == false);
    }
}