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); } }