#include <bits/stdc++.h> using namespace std; struct node{ int x,y,t; }p; int n; bool check( int x,int y){ if(x>=n ||y>=n || x<0 || y<0) return false; return true; } int main(){ cin >> n; for(int i=0; i<n-1; i++){ for(int j=0; j<n-1; j++){ int p1=0; queue<node> q; p.x = 0; p.y = 0; p.t = 0; q.push(p); int a = i+1; int b = j+1; bool visited[50][50]; memset(visited,false,sizeof visited); while(!q.empty()){ int xt = q.front().x; int yt = q.front().y; int t1 = q.front().t; if(xt == n-1 && yt == n-1){ cout<<t1<<" "; p1=1; break; } q.pop(); if(check(xt+a,yt+b) && visited[xt+a][yt+b] == false){ p.x = xt+a; p.y = yt+b; p.t = t1+1; q.push(p); visited[p.x][p.y] = true; } if(check(xt-a,yt+b) && visited[xt-a][yt+b] == false){ p.x = xt-a; p.y = yt+b; p.t = t1+1; q.push(p); visited[p.x][p.y] = true; } if(check(xt+a,yt-b) && visited[xt+a][yt-b] == false){ p.x = xt+a; p.y = yt-b; p.t = t1+1; q.push(p); visited[p.x][p.y] = true; } if(check(xt-a,yt-b) && visited[xt-a][yt-b] == false){ p.x = xt-a; p.y = yt-b; p.t = t1+1; q.push(p); visited[p.x][p.y] = true; } if(check(xt+b,yt+a) && visited[xt+b][yt+a] == false){ p.x = xt+b; p.y = yt+a; p.t = t1+1; q.push(p); visited[p.x][p.y] = true; } if(check(xt-b,yt+a) && visited[xt-b][yt+a] == false){ p.x = xt-b; p.y = yt+a; p.t = t1+1; q.push(p); visited[p.x][p.y] = true; } if(check(xt+b,yt-a) && visited[xt+b][yt-a] == false){ p.x = xt+b; p.y = yt-a; p.t = t1+1; q.push(p); visited[p.x][p.y] = true; } if(check(xt-b,yt-a) && visited[xt-b][yt-a] == false){ p.x = xt-b; p.y = yt-a; p.t = t1+1; q.push(p); visited[p.x][p.y] = true; } } if(p1 == 0) cout<<-1<<" "; } cout<<endl; } return 0; }