#include <bits/stdc++.h>

using namespace std;

#define SPEED ios::sync_with_stdio(false); cin.tie(0)
#define ll long long int
#define FF first
#define SS second
#define mp make_pair
#define pb push_back
#define sd(x) scanf("%d",&x)
#define slld(x) scanf("%lld",&x)
#define pd(x) printf("%d\n",x)
#define plld(x) printf("%lld\n",x)
#define pss printf
#define MOD 1000000007
#define INF 1e18
#define eps 0.00001
#define debug(n1) cout<<n1<<endl
ll ans=1e18,n;
ll dist[26][26];
bool visited[26][26];
vector<ll>adj[700];
ll make(ll a,ll b,ll cnt)
{
	
	
for(int i=0;i<n;i++)
{
	for(int j=0;j<n;j++)
    {
	dist[i][j]=INF;
  
    }
}
dist[0][0]=0;

set<pair<ll,pair<ll,ll>>>s;
s.insert(mp(0,mp(0,0)));


while(!s.empty())
{
	auto k=s.begin();
	ll i=k->SS.FF;
	ll j=k->SS.SS;
	ll d=k->FF;
    //cout<<i<<" "<<j<<" "<<d<<endl;
	s.erase(s.begin());
	if(i+a<n && j+b<n && !visited[i+a][j+b])
	{
		if(dist[i+a][j+b]>d+1)
		{
			//auto h=s.find(mp(dist[i+a][j+b],mp(i+a,j+b)));
			//s.erase(h);
			dist[i+a][j+b]=d+1;
			s.insert(mp(d+1,mp(i+a,j+b)));
		}
	}
	if(i-a>=0 && j+b<n && !visited[i-a][j+b])
	{
		if(dist[i-a][j+b]>d+1)
		{
			//auto h=s.find(mp(dist[i-a][j+b],mp(i-a,j+b)));
			//s.erase(h);
			dist[i-a][j+b]=d+1;
			s.insert(mp(d+1,mp(i-a,j+b)));
		}
	}
	if(i-a>=0 && j-b>=0 && !visited[i-a][j-b])
	{
		if(dist[i-a][j-b]>d+1)
		{
			//auto h=s.find(mp(dist[i-a][j-b],mp(i-a,j-b)));
			//s.erase(h);
			dist[i-a][j-b]=d+1;
			s.insert(mp(d+1,mp(i-a,j-b)));
		}
	}
	if(i+a<n && j-b>=0 && !visited[i+a][j-b])
	{
		if(dist[i+a][j-b]>d+1)
		{
			//auto h=s.find(mp(dist[i+a][j-b],mp(i+a,j-b)));
			//s.erase(h);
			dist[i+a][j-b]=d+1;
			s.insert(mp(d+1,mp(i+a,j-b)));
		}
	}
	swap(a,b);
    if(i+a<n && j+b<n && !visited[i+a][j+b])
	{
		if(dist[i+a][j+b]>d+1)
		{
			//auto h=s.find(mp(dist[i+a][j+b],mp(i+a,j+b)));
			//s.erase(h);
			dist[i+a][j+b]=d+1;
			s.insert(mp(d+1,mp(i+a,j+b)));
		}
	}
	if(i-a>=0 && j+b<n && !visited[i-a][j+b])
	{
		if(dist[i-a][j+b]>d+1)
		{
			//auto h=s.find(mp(dist[i-a][j+b],mp(i-a,j+b)));
			//s.erase(h);
			dist[i-a][j+b]=d+1;
			s.insert(mp(d+1,mp(i-a,j+b)));
		}
	}
	if(i-a>=0 && j-b>=0 && !visited[i-a][j-b])
	{
		if(dist[i-a][j-b]>d+1)
		{
			//auto h=s.find(mp(dist[i-a][j-b],mp(i-a,j-b)));
			//s.erase(h);
			dist[i-a][j-b]=d+1;
			s.insert(mp(d+1,mp(i-a,j-b)));
		}
	}
	if(i+a<n && j-b>=0 && !visited[i+a][j-b])
	{
		if(dist[i+a][j-b]>d+1)
		{
			//auto h=s.find(mp(dist[i+a][j-b],mp(i+a,j-b)));
			//s.erase(h);
			dist[i+a][j-b]=d+1;
			s.insert(mp(d+1,mp(i+a,j-b)));
		}
	}
	swap(a,b);
}
return dist[n-1][n-1];
 
}


int main() {


slld (n);


for(int i=1;i<n;i++)
{
	for(int j=1;j<n;j++)
	{
		ans=make(i,j,0);
		if(ans!=1e18)cout<<ans<<" ";
		else cout<<-1<<" ";
	}
	cout<<endl;
}

	return 0;
           }