import sys from collections import deque def solve(): data = sys.stdin.buffer.read().split() H, W = map(int, data[:2]) grid = [row.decode() for row in data[2:]] INF = 10**9 dist = [INF] * (H * W) if grid[0][0] != '#': dist[0] = 0 q = deque([0]) while q: v = q.popleft() i, j = divmod(v, W) nd = dist[v] + 1 for ni, nj in ((i-1,j),(i+1,j),(i,j-1),(i,j+1)): if 0 <= ni < H and 0 <= nj < W: nv = ni * W + nj if dist[nv] == INF and grid[ni][nj] != '#': dist[nv] = nd q.append(nv) best = dist[H*W - 1] mS = bytearray(H * W) if grid[0][0] != '#': mS[0] = 1 for i in range(H): for j in range(W): if i == 0 and j == 0: continue if grid[i][j] == '#': continue v = i * W + j if (i and mS[v - W]) or (j and mS[v - 1]): mS[v] = 1 mG = bytearray(H * W) goal = (H - 1) * W + (W - 1) if grid[H-1][W-1] != '#': mG[goal] = 1 for i in range(H-1, -1, -1): for j in range(W-1, -1, -1): if i == H-1 and j == W-1: continue if grid[i][j] == '#': continue v = i * W + j if (i < H-1 and mG[v + W]) or (j < W-1 and mG[v + 1]): mG[v] = 1 ok = False for g in range(H - 1): s_min, g_max = W, -1 a, b = g * W, (g + 1) * W for j in range(W): if mS[a + j] and j < s_min: s_min = j if mG[b + j] and j > g_max: g_max = j if s_min <= g_max: ok = True break if not ok: for c in range(W - 1): s_min, g_max = H, -1 for i in range(H): if mS[i*W + c] and i < s_min: s_min = i if mG[i*W + c + 1] and i > g_max: g_max = i if s_min <= g_max: ok = True break if ok: best = min(best, H + W - 1) best = min(best, H + W) print(best) if __name__ == "__main__": solve()