#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
#define MAXN 9
#define INF 0x3f3f3f3f
int mov[4][2]={{1,0},{0,1},{0,-1},{-1,0}};
int n;
int a[MAXN][MAXN];
int g[MAXN][MAXN];
int vis[MAXN][MAXN],bfstime=0;
int vis2[6];
int q[MAXN*MAXN][2];
/*
bool dfs(int chs,int lev)
{
if (!lev)return false;
int i,j;
int old[8];
for (i=0;i<n;i++)
{
old[i]=0;
for (j=0;j<n;j++)
old[i]=old[i]*6+a[i][j];
}
int x,y;
x=0;y=0;
bool ret=false;
int head=-1,tail=0;
int ii;
int c,d;
int nc=0;
for (ii=0;!ret && ii<6;ii++)
{
if (!((1<<ii)&chs))continue;
nc=0;
x=y=0;
c=a[x][y];
a[x][y]=ii;
vis[x][y]=++bfstime;
head=-1;tail=0;
while (head<tail)
{
x=q[++head][0];
y=q[head][1];
for (i=0;i<4;i++)
{
x+=mov[i][0];
y+=mov[i][1];
if (x>=0 && y>=0 && x<n && y<n && vis[x][y]!=bfstime && a[x][y]==c)
{
vis[x][y]=bfstime;
q[++tail][0]=x;
q[tail][1]=y;
a[x][y]=ii;
}
x-=mov[i][0];
y-=mov[i][1];
}
}
head=-1;
while (head<tail)
{
x=q[++head][0];
y=q[head][1];
for (i=0;i<4;i++)
{
x+=mov[i][0];
y+=mov[i][1];
if (x>=0 && y>=0 && x<n && y<n && vis[x][y]!=bfstime)
{
if (a[x][y]==ii)
{
vis[x][y]=bfstime;
q[++tail][0]=x;
q[tail][1]=y;
}else
{
nc|=(1<<a[x][y]);
}
}
x-=mov[i][0];
y-=mov[i][1];
}
}
if (tail==n*n-1)
{
ret=true;
}
head=-1;
// memset(dis,INF,sizeof(dis));
for (i=0;i<=tail;i++)
dis[q[i][0]][q[i][1]]=0;
c=0;
while (head<tail)
{
x=q[++head][0];
y=q[head][1];
d=dis[x][y];
for (i=0;i<4;i++)
{
x+=mov[i][0];
y+=mov[i][1];
if (x>=0 && y>=0 && x<n && y<n && vis[x][y]!=bfstime)
{
vis[x][y]=bfstime;
dis[x][y]=d+1;
x=max(c,d+1);
}
x-=mov[i][0];
y-=mov[i][1];
}
}
d=0;
for (i=0;i<n;i++)
for (j=0;j<n;j++)
if (vis2[a[i][j]]!=bfstime)
{
vis2[a[i][j]]=bfstime;
d++;
}
d--;
c=max(c,d);
if (lev-1>=c && !ret && dfs(nc,lev-1))
{
ret=true;
}
for (i=0;i<n;i++)
{
x=old[i];
for (j=n-1;j>=0;j--)
{
a[i][j]=x%6;
x/=6;
}
}
}
return ret;
}
*/
bool dfs(int lev)
{
if (!lev)return false;
int i,j;
int x,y;
bool ret=false;
int head=-1,tail=0;
int ii;
int c;
int grec[MAXN][MAXN];
memcpy(grec,g,sizeof(grec));
for (ii=0;!ret && ii<6;ii++)
{
head=-1,tail=-1;
++bfstime;
for (i=0;i<n;i++)
{
for (j=0;j<n;j++)
{
if (g[i][j]==2 && a[i][j]==ii)
{
q[++tail][0]=i;
q[tail][1]=j;
vis[i][j]=bfstime;
g[i][j]=1;
}
}
}
if (head==tail)continue;
while (head<tail)
{
x=q[++head][0];
y=q[head][1];
for (i=0;i<4;i++)
{
x+=mov[i][0];
y+=mov[i][1];
if (x>=0 && y>=0 && x<n && y<n && !g[x][y] )
{
if (a[x][y]==ii)
{
q[++tail][0]=x;
q[tail][1]=y;
g[x][y]=1;
}else
{
g[x][y]=2;
}
}
x-=mov[i][0];
y-=mov[i][1];
}
}
c=0;
for (i=0;i<n;i++)
for (j=0;j<n;j++)
{
if (g[i][j]!=1 && vis2[a[i][j]]!=bfstime)
{
vis2[a[i][j]]=bfstime;
c++;
}
}
if (!c)
return true;
if (lev-1>=c && dfs(lev-1))
{
ret=true;
}
memcpy(g,grec,sizeof(grec));
}
return ret;
}
int main()
{
//reopen("input.txt","r",stdin);
// freopen("output.txt","w",stdout);
while (scanf("%d",&n),n)
{
int i,j;
for (i=0;i<n;i++)
for (j=0;j<n;j++)
scanf("%d",&a[i][j]);
int l,r;
l=0,r=19;
int mid;
g[0][0]=2;
while (l+1<r)
{
mid=(l+r)>>1;
memset(g,0,sizeof(g));
g[0][0]=2;
if (dfs(mid))
r=mid;
else
l=mid;
}
printf("%d\n",r-1);
}
}