import java.util.*;
// 注意类名必须为 Main, 不要有任何 package xxx 信息
import java.util.*;
public class Main {
static int n, m;
static int xs, ys, xe, ye;
static char[][] graph = new char[1010][1010];
static int[][] directions = {{-1,0},{1,0},{0,-1},{0,1}};
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
// 读取迷宫尺寸和坐标
n = in.nextInt();
m = in.nextInt();
xs = in.nextInt();
ys = in.nextInt();
xe = in.nextInt();
ye = in.nextInt();
in.nextLine(); // 消耗掉剩余的换行符,避免影响后续读取
// 读取迷宫内容(使用hasNextLine判断)
for (int i = 0; i < n; i++) {
String line = in.nextLine();
graph[i] = line.toCharArray();
}
// 调用BFS(注意坐标转换为0-based)
System.out.println(bfs(graph, xs - 1, ys - 1, xe - 1, ye - 1));
}
public static int bfs(char[][] graph, int xs, int ys, int xe, int ye) {
// 检查输入合法性
if (graph == null || graph.length == 0 || graph[0].length == 0) {
return -1;
}
// 检查起点和终点是否为障碍物
if (graph[xs][ys] == '*' || graph[xe][ye] == '*') {
return -1;
}
boolean[][] vis = new boolean[n][m];
Queue<int[]> queue = new LinkedList<>();
queue.add(new int[]{xs, ys, 0});
vis[xs][ys] = true;
while (!queue.isEmpty()) {
int[] current = queue.poll();
int x = current[0];
int y = current[1];
int steps = current[2];
// 到达终点,返回步数
if (x == xe && y == ye) {
return steps;
}
// 探索四个方向
for (int[] dir : directions) {
int nx = x + dir[0];
int ny = y + dir[1];
// 检查新位置是否合法:在范围内、非障碍物、未访问
if (nx >= 0 && nx < n && ny >= 0 && ny < m) {
if (graph[nx][ny] != '*' && !vis[nx][ny]) {
vis[nx][ny] = true; // 确认合法后再标记访问
queue.add(new int[]{nx, ny, steps + 1});
}
}
}
}
// 无法到达终点
return -1;
}
}