#include <cstdio>
#include <queue>
#define MAX 110
using namespace std;
int n, s, d;
int map[MAX][MAX], visited[MAX][MAX][7], dx[4] = {0,1,0,-1}, dy[4] = {1,0,-1,0};
struct STATE{ int h, w, s; };
queue<STATE> Q;
int main()
{
    freopen(".15.in","r",stdin);
    freopen(".15.out","w",stdout);
    scanf("%d%d%d", &n, &s, &d);
    for(int i = 0 ; i < n ; i++ )
        for(int j = 0 ; j < n ; j++ )
            scanf("%d", &map[i][j]);
    Q.push((STATE){0,0,s}); visited[0][0][s] = 1;
    while(!Q.empty())
    {
        STATE t = Q.front(); Q.pop();
        if( t.h == n-1 && t.w == n-1 && t.s == d )
        {
            printf("%d", visited[n-1][n-1][d] - 1 );
            return 0;
        }
        for(int i = 0 ; i < 4 ; i++ )
            if( (0 <= t.h+dx[i] && t.h+dx[i] < n && 0 <= t.w+dy[i]&&t.w+dy[i] < n )
               && !visited[t.h+dx[i]][t.w+dy[i]][(t.s+1)%7] &&
               map[t.h+dx[i]][t.w+dy[i]] == 0 )
                visited[t.h+dx[i]][t.w+dy[i]][(t.s+1)%7] = visited[t.h][t.w][t.s]+1,
                Q.push((STATE){t.h+dx[i],t.w+dy[i],(t.s+1)%7});
    }
    printf("-1");
    return 0;
}
