#include using namespace std; int main() { ios_base::sync_with_stdio(false); cin.tie(NULL); int H, W; cin >> H >> W; vector grid(H); for (int i = 0; i < H; ++i) cin >> grid[i]; long long HW = (long long)H * W; vector dist(4 * HW, -1); vector q; q.reserve(4 * HW); dist[0] = 0; q.push_back(0); int head = 0; while (head < q.size()) { int curr = q[head++]; int d = dist[curr]; int p = curr / HW; int rem = curr % HW; int r = rem / W; int c = rem % W; if (p == 0) { int dr[] = {0, 0, 1, -1}, dc[] = {1, -1, 0, 0}; for (int i = 0; i < 4; ++i) { int nr = r + dr[i], nc = c + dc[i]; if (nr >= 0 && nr < H && nc >= 0 && nc < W && grid[nr][nc] != '#') { int nxt = nr * W + nc; if (dist[nxt] == -1) { dist[nxt] = d + 1; q.push_back(nxt); } } } if (r < H - 1) { int nxt = 1 * HW + r * W + c; if (dist[nxt] == -1) { dist[nxt] = d + 1; q.push_back(nxt); } } if (r > 0) { int nxt = 1 * HW + (r - 1) * W + c; if (dist[nxt] == -1) { dist[nxt] = d + 1; q.push_back(nxt); } } if (c < W - 1) { int nxt = 2 * HW + r * W + c; if (dist[nxt] == -1) { dist[nxt] = d + 1; q.push_back(nxt); } } if (c > 0) { int nxt = 2 * HW + r * W + (c - 1); if (dist[nxt] == -1) { dist[nxt] = d + 1; q.push_back(nxt); } } } else if (p == 1) { if (c > 0) { int nxt = 1 * HW + r * W + (c - 1); if (dist[nxt] == -1) { dist[nxt] = d + 1; q.push_back(nxt); } } if (c < W - 1) { int nxt = 1 * HW + r * W + (c + 1); if (dist[nxt] == -1) { dist[nxt] = d + 1; q.push_back(nxt); } } if (grid[r][c] != '#') { int nxt = r * W + c; if (dist[nxt] == -1) { dist[nxt] = d + 1; q.push_back(nxt); } } if (grid[r + 1][c] != '#') { int nxt = (r + 1) * W + c; if (dist[nxt] == -1) { dist[nxt] = d + 1; q.push_back(nxt); } } if (c < W - 1) { int nxt = 3 * HW + r * W + c; if (dist[nxt] == -1) { dist[nxt] = d + 1; q.push_back(nxt); } } if (c > 0) { int nxt = 3 * HW + r * W + (c - 1); if (dist[nxt] == -1) { dist[nxt] = d + 1; q.push_back(nxt); } } } else if (p == 2) { if (r > 0) { int nxt = 2 * HW + (r - 1) * W + c; if (dist[nxt] == -1) { dist[nxt] = d + 1; q.push_back(nxt); } } if (r < H - 1) { int nxt = 2 * HW + (r + 1) * W + c; if (dist[nxt] == -1) { dist[nxt] = d + 1; q.push_back(nxt); } } if (grid[r][c] != '#') { int nxt = r * W + c; if (dist[nxt] == -1) { dist[nxt] = d + 1; q.push_back(nxt); } } if (grid[r][c + 1] != '#') { int nxt = r * W + (c + 1); if (dist[nxt] == -1) { dist[nxt] = d + 1; q.push_back(nxt); } } if (r < H - 1) { int nxt = 3 * HW + r * W + c; if (dist[nxt] == -1) { dist[nxt] = d + 1; q.push_back(nxt); } } if (r > 0) { int nxt = 3 * HW + (r - 1) * W + c; if (dist[nxt] == -1) { dist[nxt] = d + 1; q.push_back(nxt); } } } else { int n1 = 1 * HW + r * W + c, n2 = 1 * HW + r * W + (c + 1); int n3 = 2 * HW + r * W + c, n4 = 2 * HW + (r + 1) * W + c; if (dist[n1] == -1) { dist[n1] = d + 1; q.push_back(n1); } if (dist[n2] == -1) { dist[n2] = d + 1; q.push_back(n2); } if (dist[n3] == -1) { dist[n3] = d + 1; q.push_back(n3); } if (dist[n4] == -1) { dist[n4] = d + 1; q.push_back(n4); } } } cout << dist[(H - 1) * W + (W - 1)] << endl; return 0; }