#include<iostream>
#include<queue>
using namespace std;
const int INF=0xfffffff;
const int MAX=55;
struct point
{
int x;
int y;
};
int t[MAX][MAX];
int m[MAX][MAX];
bool inq[MAX][MAX];
__int64 way[MAX][MAX];
int gx[4]={1,0,-1,0};
int gy[4]={0,1,0,-1};
int n;
void bfs();
bool inside(int x,int y);
__int64 dfs(int i,int j);
int main()
{
while(scanf("%d",&n)!=EOF)
{
int i,j;
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
scanf("%d",&t[i][j]);
bfs();
memset(way,-1,sizeof(way));
dfs(1,1);
printf("%I64d\n",way[1][1]);
}
return 0;
}
void bfs()
{
queue<point> qq;
memset(inq,0,sizeof(inq));
point qn;
qn.x=n;
qn.y=n;
qq.push(qn);
inq[n][n]=1;
int i,j;
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
m[i][j]=INF;
m[n][n]=t[n][n];
while(!qq.empty())
{
point q=qq.front();
qq.pop();
int l;
inq[q.x][q.y]=0;
for(l=0;l<4;l++)
{
point p=q;
p.x+=gx[l];
p.y+=gy[l];
if(inside(p.x,p.y)&&(t[p.x][p.y]+m[q.x][q.y]<m[p.x][p.y]))
{
m[p.x][p.y]=t[p.x][p.y]+m[q.x][q.y];
if(!inq[p.x][p.y])
{
inq[p.x][p.y]=1;
qq.push(p);
}
}
}
}
}
bool inside(int x,int y)
{
if(x<=n&&x>0&&y<=n&&y>0)
return 1;
return 0;
}
__int64 dfs(int i,int j)
{
int l;
int& sum=m[i][j];
__int64& w=way[i][j];
if(i==n&&j==n) return 1;
if(w!=-1) return w;
w=0;
for(l=0;l<4;l++)
{
i+=gx[l];
j+=gy[l];
if(inside(i,j)&&(m[i][j]<sum))
w+=dfs(i,j);
i-=gx[l];
j-=gy[l];
}
return w;
}