from heapq import heappush, heappop from collections import deque def solve(): H,W = map(int,input().split()) sx,sy = map(lambda x:int(x)-1, input().split()) gx,gy = map(lambda x:int(x)-1, input().split()) A = [list(input().rstrip()) for _ in range(H)] dx = gx - sx dy = gy - sy vis = [[False]*W for _ in range(H)] dq = deque([(sx,sy)]) vis[sx][sy] = True while dq: x,y = dq.popleft() for dxx,dyy in ((1,0),(-1,0),(0,1),(0,-1)): nx,ny = x+dxx, y+dyy if 0<=nx0) and (C1+D1>0) ): d2 = [[-1]*W for _ in range(H)] dq3 = deque(path) for x,y in path: d2[x][y] = 0 while dq3: x,y = dq3.popleft() for dx_,dy_ in ((1,0),(-1,0),(0,1),(0,-1)): nx,ny = x+dx_, y+dy_ if 0<=nx=0: best_v = min(best_v, d2[ii][jj]) best_h = INF for i in range(H): for j in range(W-1): if A[i][j] != '#' and A[i][j+1] != '#': for (ii,jj) in ((i,j),(i,j+1)): if d2[ii][jj]>=0: best_h = min(best_h, d2[ii][jj]) base0 = A1 + B1 + C1 + D1 # 最短路長 extra = 0 # 縦移動ゼロならループ寄り道 if A1+B1 == 0: if best_v < INF: C1 += best_v D1 += best_v extra += 2*best_v + 4 else: extra = INF # 横移動ゼロならループ寄り道 if C1+D1 == 0: if best_h < INF: A1 += best_h B1 += best_h extra += 2*best_h + 4 else: extra = INF # ── ここから素数パディング追加 ── if extra < INF: # 縦移動のパディング if A1+B1 == 0: # 2往復して A'=B'=2 なので、2は素数→パディング不要 pad_v_exc = 0 else: pad_v_exc = min_pad(max(A1,B1), min(A1,B1)) # 横移動のパディング if C1+D1 == 0: pad_h_exc = 0 else: pad_h_exc = min_pad(max(C1,D1), min(C1,D1)) # 両方 None でないことを確認してマージ if pad_v_exc is not None and pad_h_exc is not None: cand = base0 + extra + 2*pad_v_exc + 2*pad_h_exc ans = cand if ans is None else min(ans, cand) # ── ここまで素数パディング追加 ── print(ans if ans is not None else -1) solve() """ 2 3 2 2 2 3 .## .SG """