import sys from collections import deque def solve(): input = sys.stdin.read data = input().split() if not data: return H = int(data[0]) W = int(data[1]) grid = data[2:] # 頂点の状態を拡張: # 0: 通常のマスにいる # 1: 挿入された行 (縦方向に自由に動ける通路の横移動中) にいる # 2: 挿入された列 (横方向に自由に動ける通路の縦移動中) にいる # 距離配列 INF = float('inf') dist = [[[INF] * W for _ in range(H)] for _ in range(3)] # deque (cost, state, r, c) q = deque() # スタート地点 dist[0][0][0] = 0 q.append((0, 0, 0, 0)) # 移動方向 (上下左右) dr = [-1, 1, 0, 0] dc = [0, 0, -1, 1] while q: d, state, r, c = q.popleft() if d > dist[state][r][c]: continue if r == H - 1 and c == W - 1 and state == 0: print(d) return # 状態 0: 通常のマス if state == 0: # 1. 通常の移動 (隣接するマスへ) for i in range(4): nr, nc = r + dr[i], c + dc[i] if 0 <= nr < H and 0 <= nc < W and grid[nr][nc] != '#': if dist[0][nr][nc] > d + 1: dist[0][nr][nc] = d + 1 q.append((d + 1, 0, nr, nc)) # 2. 挿入された行に入る (下向きに挿入された行があるとする) if r + 1 < H: if dist[1][r][c] > d + 1: dist[1][r][c] = d + 1 q.append((d + 1, 1, r, c)) # 挿入された行に入る (上向き) if r - 1 >= 0: if dist[1][r - 1][c] > d + 1: dist[1][r - 1][c] = d + 1 q.append((d + 1, 1, r - 1, c)) # 3. 挿入された列に入る (右向き) if c + 1 < W: if dist[2][r][c] > d + 1: dist[2][r][c] = d + 1 q.append((d + 1, 2, r, c)) # 挿入された列に入る (左向き) if c - 1 >= 0: if dist[2][r][c - 1] > d + 1: dist[2][r][c - 1] = d + 1 q.append((d + 1, 2, r, c - 1)) # 状態 1: 挿入された行にいる場合 elif state == 1: # 1. 同じ挿入行内を左右に移動 for nc in [c - 1, c + 1]: if 0 <= nc < W: if dist[1][r][nc] > d + 1: dist[1][r][nc] = d + 1 q.append((d + 1, 1, r, nc)) # 2. 元のグリッド (上下の行のどちらか) に戻る for nr in [r, r + 1]: # r は挿入行のすぐ上の行インデックス if 0 <= nr < H and grid[nr][c] != '#': if dist[0][nr][c] > d + 1: dist[0][nr][c] = d + 1 q.append((d + 1, 0, nr, c)) # (挿入された行から別の挿入された列へ直接移ることは、交差点が通路になるため可能ですが # 一度通常マスを介すのと同等なので省略可能) # 状態 2: 挿入された列にいる場合 elif state == 2: # 1. 同じ挿入列内を上下に移動 for nr in [r - 1, r + 1]: if 0 <= nr < H: if dist[2][nr][c] > d + 1: dist[2][nr][c] = d + 1 q.append((d + 1, 2, nr, c)) # 2. 元のグリッド (左右の列のどちらか) に戻る for nc in [c, c + 1]: # c は挿入列のすぐ左の列インデックス if 0 <= nc < W and grid[r][nc] != '#': if dist[0][r][nc] > d + 1: dist[0][r][nc] = d + 1 q.append((d + 1, 0, r, nc)) # ゴールに到達できない場合 print(-1) if __name__ == '__main__': solve()