import sys def solve(): input_data = sys.stdin.read().split() if not input_data: return H = int(input_data[0]) W = int(input_data[1]) grid = input_data[2:] R = 2 * H - 1 C = 2 * W - 1 N = R * C # bytearray super cepat & hemat memori untuk Python visited = bytearray(N) # Pre-fill grid walls for r in range(H): row = grid[r] base = 2 * r * C for c in range(W): if row[c] == '#': visited[base + 2 * c] = 1 target = N - 1 if target == 0: print(0) return q = [0] visited[0] = 1 step = 0 C2 = 2 * C while q: step += 1 new_q = [] app = new_q.append for u in q: c = u % C r = u // C # 1-step moves (semua cell bisa geser pelan) if c > 0: nxt = u - 1 if not visited[nxt]: visited[nxt] = 1 app(nxt) if c < C - 1: nxt = u + 1 if not visited[nxt]: visited[nxt] = 1 app(nxt) if r > 0: nxt = u - C if not visited[nxt]: visited[nxt] = 1 app(nxt) if r < R - 1: nxt = u + C if not visited[nxt]: visited[nxt] = 1 app(nxt) # 2-step jump horizontal (hanya untuk cell asli & lorong horizontal) if (c & 1) == 0: if c >= 2: nxt = u - 2 if not visited[nxt]: visited[nxt] = 1 app(nxt) if c < C - 2: nxt = u + 2 if not visited[nxt]: visited[nxt] = 1 app(nxt) # 2-step jump vertical (hanya untuk cell asli & lorong vertikal) if (r & 1) == 0: if r >= 2: nxt = u - C2 if not visited[nxt]: visited[nxt] = 1 app(nxt) if r < R - 2: nxt = u + C2 if not visited[nxt]: visited[nxt] = 1 app(nxt) if visited[target]: print(step) return q = new_q print(-1) if __name__ == '__main__': solve()