#include int q[6000000][3]; int main() { int i, H, W, s[2], g[2]; char A[1002][1002] = {}; scanf("%d %d", &H, &W); scanf("%d %d", &(s[0]), &(s[1])); scanf("%d %d", &(g[0]), &(g[1])); for (i = 1; i <= H; i++) scanf("%s", &(A[i][1])); const int sup = 1 << 30; int j, k, l, dist[6][1001][1001], head, tail; for (k = 0; k < 6; k++) for (i = 1; i <= H; i++) for (j = 1; j <= W; j++) dist[k][i][j] = sup; dist[0][s[0]][s[1]] = 0; q[0][0] = 0; q[0][1] = s[0]; q[0][2] = s[1]; for (head = 0, tail = 1; head < tail; head++) { k = q[head][0]; i = q[head][1]; j = q[head][2]; if (A[i-1][j] == '.') { switch (k) { case 0: l = 1; break; case 1: l = 5; break; case 2: l = 2; break; case 3: l = 0; break; case 4: l = 4; break; case 5: l = 3; break; } if (dist[l][i-1][j] == sup) { dist[l][i-1][j] = dist[k][i][j] + 1; q[tail][0] = l; q[tail][1] = i - 1; q[tail++][2] = j; } } if (A[i+1][j] == '.') { switch (k) { case 0: l = 3; break; case 1: l = 0; break; case 2: l = 2; break; case 3: l = 5; break; case 4: l = 4; break; case 5: l = 1; break; } if (dist[l][i+1][j] == sup) { dist[l][i+1][j] = dist[k][i][j] + 1; q[tail][0] = l; q[tail][1] = i + 1; q[tail++][2] = j; } } if (A[i][j-1] == '.') { switch (k) { case 0: l = 4; break; case 1: l = 1; break; case 2: l = 0; break; case 3: l = 3; break; case 4: l = 5; break; case 5: l = 2; break; } if (dist[l][i][j-1] == sup) { dist[l][i][j-1] = dist[k][i][j] + 1; q[tail][0] = l; q[tail][1] = i; q[tail++][2] = j - 1; } } if (A[i][j+1] == '.') { switch (k) { case 0: l = 2; break; case 1: l = 1; break; case 2: l = 5; break; case 3: l = 3; break; case 4: l = 0; break; case 5: l = 4; break; } if (dist[l][i][j+1] == sup) { dist[l][i][j+1] = dist[k][i][j] + 1; q[tail][0] = l; q[tail][1] = i; q[tail++][2] = j + 1; } } } if (dist[0][g[0]][g[1]] == sup) printf("-1\n"); else printf("%d\n", dist[0][g[0]][g[1]]); fflush(stdout); return 0; }