from collections import deque import sys # --- 入力 --- H, W = map(int, sys.stdin.readline().split()) Sx, Sy = map(int, sys.stdin.readline().split()) Gx, Gy = map(int, sys.stdin.readline().split()) grid = [list(sys.stdin.readline().rstrip()) for _ in range(H)] # 0‑indexed へ Sx -= 1; Sy -= 1 Gx -= 1; Gy -= 1 dirs = [ (1, 0, 0), # A ↓, bit0 (-1, 0, 1), # B ↑, bit1 (0, 1, 2), # C →, bit2 (0, -1, 3), # D ←, bit3 ] INF = 10**9 dist = [[[INF]*16 for _ in range(W)] for _ in range(H)] q = deque() start_mask = 0 # どの操作回数も 0 (偶数) dist[Sx][Sy][start_mask] = 0 q.append((Sx, Sy, start_mask)) while q: x, y, m = q.popleft() d = dist[x][y][m] if (x, y) == (Gx, Gy) and m == 0: print(d) sys.exit(0) for dx, dy, bit in dirs: nx, ny = x+dx, y+dy if 0 <= nx < H and 0 <= ny < W and grid[nx][ny] != '#': nm = m ^ (1 << bit) # 対応するビットを反転 if dist[nx][ny][nm] == INF: dist[nx][ny][nm] = d + 1 q.append((nx, ny, nm)) # 到達不可 print(-1)