#include #include using namespace std; int n; int grid[1011][1011]; pair MLeft[1011][1011]; pair MRight[1011][1011]; pair MDown[1011][1011]; pair MUp[1011][1011]; int Sx,Sy,Fx,Fy; bool TFO[1011][1011]; pair< pair,int > q[2000011]; int L=0; void TryToAdd(int X,int Y,int d) { if (X<1 || Y<1 || X>n || Y>n) return; if (TFO[X][Y]) return; L++; q[L]=make_pair( make_pair(X,Y),d+1 ); TFO[X][Y]=true; return; } int BFS() { int uk=1; int X,Y,d; int nX,nY; L=1; q[1]=make_pair( make_pair(Sx,Sy),0 ); TFO[Sx][Sy]=true; while(uk<=L) { X=q[uk].first.first; Y=q[uk].first.second; d=q[uk].second; if (X==Fx && Y==Fy) return d; nX=MDown[X+1][Y].first; nY=MDown[X+1][Y].second; TryToAdd(nX,nY,d); /// nX=MRight[X][Y+1].first; nY=MRight[X][Y+1].second; TryToAdd(nX,nY,d); /// nX=MUp[X-1][Y].first; nY=MUp[X-1][Y].second; TryToAdd(nX,nY,d); /// nX=MLeft[X][Y-1].first; nY=MLeft[X][Y-1].second; TryToAdd(nX,nY,d); uk++; } return -1; } int main() { freopen("ice.in","r",stdin); freopen("ice.out","w",stdout); int i,j; int ans; scanf("%d",&n); for (i=1;i<=n;i++) { for (j=1;j<=n;j++) { scanf("%d",&grid[i][j]); } } scanf("%d %d %d %d",&Sx,&Sy,&Fx,&Fy); for (i=0;i<=n+1;i++) { for (j=0;j<=n+1;j++) { MUp[i][j]=make_pair(0,0); MDown[i][j]=make_pair(0,0); MRight[i][j]=make_pair(0,0); MLeft[i][j]=make_pair(0,0); } } for (i=1;i<=n;i++) { for (j=1;j<=n;j++) { if (grid[i][j]==0) { MUp[i][j]=make_pair(i,j); MLeft[i][j]=make_pair(i,j); } else { MUp[i][j]=MUp[i-1][j]; MLeft[i][j]=MLeft[i][j-1]; } } } for (i=n;i>=1;i--) { for (j=n;j>=1;j--) { if (grid[i][j]==0) { MDown[i][j]=make_pair(i,j); MRight[i][j]=make_pair(i,j); } else { MDown[i][j]=MDown[i+1][j]; MRight[i][j]=MRight[i][j+1]; } } } ans=BFS(); printf("%d\n",ans); return 0; }