object Solution {

    def main(args: Array[String]) {
        val sc = new java.util.Scanner (System.in);
        var n = sc.nextInt();
        time{ allCombinations(n) }
    }
    
    def allCombinations(n:Int) = {
        var board = Array.ofDim[Boolean](n,n)
            
        for(i <- 1 until n){
            for(j <- 1 until n){
                board = Array.ofDim[Boolean](n,n)
                val res = findMinMoves(board, n, i, j, 0, 0, 0)
                if(res == 1000000) print("-1 ")
                else print(res+" ")
            }
            print("\n")
        }
    }
    
    def findMinMoves(board:Array[Array[Boolean]], n:Int, i:Int, j:Int, x:Int, y:Int, nbMovesSoFar:Int):Int = {
        // Don't get out of the board
        if(x<0 || y<0 || x>n-1 || y > n-1){
            //println("Sorti de la zone : "+x+" "+y)
            return 1000000
        }
        // Skip the tiles already visited
        if(board(x)(y) == true) return 1000000
            
        if(x == n-1 && y == n-1){
            //println("Arrivée")
            return nbMovesSoFar
        }
        
        board(x)(y) = true
        
        //println("Possibilité : "+x+" "+y)
        return min(findMinMoves(board, n, i, j, x+i, y+j, nbMovesSoFar+1),
                   findMinMoves(board, n, i, j, x-i, y+j,nbMovesSoFar+1),
                   findMinMoves(board, n, i, j, x+i, y-j,nbMovesSoFar+1),
                   findMinMoves(board, n, i, j, x-i, y-j,nbMovesSoFar+1),
                   findMinMoves(board, n, i, j, x+j, y+i,nbMovesSoFar+1),
                   findMinMoves(board, n, i, j, x-j, y+i,nbMovesSoFar+1),
                   findMinMoves(board, n, i, j, x+j, y-i,nbMovesSoFar+1),
                   findMinMoves(board, n, i, j, x-j, y-i,nbMovesSoFar+1)
                  )
    }
    
    def min(a:Int, b:Int, c:Int, d:Int, e:Int, f:Int, g:Int, h:Int):Int = {
        var min = a
        min = if(b<min) b else min
        min = if(c<min) c else min
        min = if(d<min) d else min
        min = if(e<min) e else min
        min = if(f<min) f else min
        min = if(g<min) g else min
        min = if(h<min) h else min
        return min
    }
    
    def time[R](block: => R): R = {  
        val t0 = System.nanoTime()
        val result = block    // call-by-name
        val t1 = System.nanoTime()
        System.err.println("Elapsed time: " + (t1 - t0) + "ns")
        result
    }
}