process.stdin.resume();
process.stdin.setEncoding('ascii');

var input_stdin = "";
var input_stdin_array = "";
var input_currentline = 0;

process.stdin.on('data', function (data) {
    input_stdin += data;
});

process.stdin.on('end', function () {
    input_stdin_array = input_stdin.split("\n");
    main();    
});

function readLine() {
    return input_stdin_array[input_currentline++];
}

/////////////// ignore above this line ////////////////////


function getPossiblePositions(xd, yd, x, y, n){
    let possibilities = [];
    
    possibilities.push([x-xd, y-yd]);
    possibilities.push([x+xd, y-yd]);
    possibilities.push([x-xd, y+yd]);
    possibilities.push([x+xd, y+yd]);
    
    possibilities.push([x-yd, y-xd]);
    possibilities.push([x+yd, y-xd]);
    possibilities.push([x-yd, y+xd]);
    possibilities.push([x+yd, y+xd]);    
    
    return possibilities.filter(point => point[0] >=0 && point[1] >=0 && point[0] < n && point[1] < n);
    
}

function getMoves(i, j, n){
    let triedPositions = {};
    let positions = [[0,0]];
    let moves = 0;
    let foundMin = false;

    while(!foundMin){
        let newPositions = [];
        positions.forEach(function(position){
            getPossiblePositions(i, j, position[0], position[1], n).forEach(function(newPos){
                if(newPos[0]==n-1 && newPos[1] ==n-1){
                    foundMin=true;
                }
                if(!triedPositions[newPos[0]+','+newPos[1]]){
                    newPositions.push(newPos);           
                    triedPositions[newPos[0]+','+newPos[1]] = true;
                }
            })
        })
        positions = newPositions;
        moves++;
        if(!positions.length){
            foundMin=true;
            moves = -1;
        }
    }
    return moves;
}

function main() {
    var n = parseInt(readLine());

    for(var i=1; i<n; i++){
        let moveList = [];
        for(var j=1; j<n; j++){
            moveList.push(getMoves(i,j,n));
        }
       console.log(moveList.join(' '));
    }
}