cspjcspjcspj
#include <bits/stdc++.h>
using namespace std;
const int D[4][2]={{0,1},{0,-1},{1,0},{-1,0}};
int n,a[1010][1010],dist[1010][1010][2];
struct Node{
int x,y,z;
};
queue<Node> q;
void bfs(){
memset(dist,127,sizeof(dist));
q.push({1,1,0});q.push({1,1,1});
dist[1][1][0]=dist[1][1][1]=1;
while(!q.empty()){
int x=q.front().x,y=q.front().y,z=q.front().z;
if(x==n&&y==n) break;
q.pop();
for(int i=0;i<4;i++){
int xx=x+D[i][0],yy=y+D[i][1];
if(xx<1||xx>n||yy<1||yy>n) continue;
if(z&&a[xx][yy]>a[x][y]&&dist[xx][yy][0]>dist[x][y][1]+1){
dist[xx][yy][0]=dist[x][y][1]+1;
q.push({xx,yy,0});
}else if(!z&&a[xx][yy]<a[x][y]&&dist[xx][yy][1]>dist[x][y][0]+1){
dist[xx][yy][1]=dist[x][y][0]+1;
q.push({xx,yy,1});
}
}
}
int ans=min(dist[n][n][0],dist[n][n][1]);
if(ans!=dist[0][0][0]) printf("%lld",ans);
else printf("-1");
}
int main(){
scanf("%d",&n);
for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) scanf("%d",&a[i][j]);
bfs();
return 0;
}