#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; }