#include<stdio.h>
#include<stdlib.h>
int p=-1,visited[576][2],a,b,c,d,e,f,g,h;
int KnightL(int ,int ,int ,int ,int );
int main()
{
int n,case1[576],i,j,co=-1,x,y;
//clrscr();
scanf("%d",&n);
for(i=1;i<n;i++)
{
for(j=1;j<n;j++)
{
for(y=0;y<576;y++)
{
visited[y][0]=NULL;
visited[y][1]=NULL;
}
co++;
x=0,y=0,p=-1,a=0,b=0,c=0,d=0,e=0,f=0,g=0,h=0;
case1[co]=KnightL(i,j,n,x,y);
}
//printf("\n");
}
co=-1;
for(i=1;i<n;i++)
{
for(j=1;j<n;j++)
{
co++;
printf("%d ",case1[co]);
}
printf("\n");
}
}





//knight moves again
int KnightL(int i,int j,int n,int x,int y)
{
int l,mi=0;
//printf("(%d,%d)\t",x,y);
if(x==n-1&&y==n-1)
return(0);
else if(x>=0&&x<n&&y>=0&&y<n)
{
for(l=0;l<=p;l++)
{
if(visited[l][0]==x&&visited[l][1]==y)
return -1;
}
p++;
visited[p][0]=x;
visited[p][1]=y;
//printf("(%d,%d)\n",visited[p][0],visited[p][1]);
//eight possibilities
a=KnightL(i,j,n,x+i,y+j);
if(a>-1)
a=a+1;
//printf(" %d ",a);
b=KnightL(i,j,n,x-i,y-j);
if(b>-1)
b=b+1;
//printf(" %d ",b);
c=KnightL(i,j,n,x+i,y-j);
if(c>-1)
c=c+1;
//printf(" %d ",c);
d=KnightL(i,j,n,x-i,y+j);
if(d>-1)
d=d+1;
//printf(" %d ",d);
e=KnightL(i,j,n,x+j,y+i);
if(e>-1)
e=e+1;
//printf(" %d ",e);
f=KnightL(i,j,n,x-j,y-i);
if(f>-1)
f=f+1;
//printf(" %d ",f);
g=KnightL(i,j,n,x+j,y-i);
if(g>-1)
g=g+1;
//printf(" %d ",g);
h=KnightL(i,j,n,x-j,y+i);
if(h>-1)
h=h+1;
//printf(" %d ",h);
mi=a;
if(b>=mi)
mi=b;
if(c>=mi)
mi=c;
if(d>=mi)
mi=d;
if(e>=mi)
mi=e;
if(f>=mi)
mi=f;
if(g>=mi)
mi=g;
if(h>=mi)
mi=h;
//printf("\t%d",mi);
return(mi);
}
else
{
return -1;
}
}