import sys from collections import deque def solve(): input_data = sys.stdin.read().split() if not input_data: return H = int(input_data[0]) W = int(input_data[1]) grid_str = "".join(input_data[2:]) C_off = 0 HR_off = H * W VR_off = HR_off + (H - 1) * W I_off = VR_off + H * (W - 1) TOTAL_NODES = I_off + (H - 1) * (W - 1) dist = [-1] * TOTAL_NODES q = deque([0]) dist[0] = 0 target = H * W - 1 Wm1 = W - 1 Hm1 = H - 1 q_popleft = q.popleft q_append = q.append while q: u = q_popleft() if u == target: print(dist[u]) return nd = dist[u] + 1 if u < HR_off: r, c = divmod(u, W) if r > 0: v = u - W if grid_str[v] != '#' and dist[v] == -1: dist[v] = nd; q_append(v) v = HR_off + v if dist[v] == -1: dist[v] = nd; q_append(v) if r < Hm1: v = u + W if grid_str[v] != '#' and dist[v] == -1: dist[v] = nd; q_append(v) v = HR_off + u if dist[v] == -1: dist[v] = nd; q_append(v) if c > 0: v = u - 1 if grid_str[v] != '#' and dist[v] == -1: dist[v] = nd; q_append(v) v = VR_off + u - r - 1 if dist[v] == -1: dist[v] = nd; q_append(v) if c < Wm1: v = u + 1 if grid_str[v] != '#' and dist[v] == -1: dist[v] = nd; q_append(v) v = VR_off + u - r if dist[v] == -1: dist[v] = nd; q_append(v) elif u < VR_off: idx = u - HR_off r, c = divmod(idx, W) if dist[idx] == -1: dist[idx] = nd; q_append(idx) v = idx + W if dist[v] == -1: dist[v] = nd; q_append(v) if c > 0: v = u - 1 if dist[v] == -1: dist[v] = nd; q_append(v) v = I_off + idx - r - 1 if dist[v] == -1: dist[v] = nd; q_append(v) if c < Wm1: v = u + 1 if dist[v] == -1: dist[v] = nd; q_append(v) v = I_off + idx - r if dist[v] == -1: dist[v] = nd; q_append(v) elif u < I_off: idx = u - VR_off r, c = divmod(idx, Wm1) v = idx + r if dist[v] == -1: dist[v] = nd; q_append(v) v += 1 if dist[v] == -1: dist[v] = nd; q_append(v) if r > 0: v = u - Wm1 if dist[v] == -1: dist[v] = nd; q_append(v) v = I_off + idx - Wm1 if dist[v] == -1: dist[v] = nd; q_append(v) if r < Hm1: v = u + Wm1 if dist[v] == -1: dist[v] = nd; q_append(v) v = I_off + idx if dist[v] == -1: dist[v] = nd; q_append(v) else: idx = u - I_off r, c = divmod(idx, Wm1) v = HR_off + idx + r if dist[v] == -1: dist[v] = nd; q_append(v) v += 1 if dist[v] == -1: dist[v] = nd; q_append(v) v = VR_off + idx if dist[v] == -1: dist[v] = nd; q_append(v) v += Wm1 if dist[v] == -1: dist[v] = nd; q_append(v) print(-1) if __name__ == '__main__': solve()