#include #include #include #include using namespace std; const int INF = 1e9; struct State { int r, c, type; }; int main() { ios::sync_with_stdio(false); cin.tie(nullptr); int H, W; cin >> H >> W; vector C(H); for (int i = 0; i < H; i++) cin >> C[i]; vector>> dist(H, vector>(W, vector(3, INF))); queue q; dist[0][0][0] = 0; q.push({0, 0, 0}); while (!q.empty()) { State curr = q.front(); q.pop(); int d = dist[curr.r][curr.c][curr.type]; if (curr.type == 0) { int dr[] = {0, 0, 1, -1}; int dc[] = {1, -1, 0, 0}; for (int i = 0; i < 4; i++) { int nr = curr.r + dr[i], nc = curr.c + dc[i]; if (nr >= 0 && nr < H && nc >= 0 && nc < W && C[nr][nc] != '#') { if (dist[nr][nc][0] > d + 1) { dist[nr][nc][0] = d + 1; q.push({nr, nc, 0}); } } } if (curr.r + 1 < H) { if (dist[curr.r][curr.c][1] > d + 1) { dist[curr.r][curr.c][1] = d + 1; q.push({curr.r, curr.c, 1}); } } if (curr.r - 1 >= 0) { if (dist[curr.r - 1][curr.c][1] > d + 1) { dist[curr.r - 1][curr.c][1] = d + 1; q.push({curr.r - 1, curr.c, 1}); } } if (curr.c + 1 < W) { if (dist[curr.r][curr.c][2] > d + 1) { dist[curr.r][curr.c][2] = d + 1; q.push({curr.r, curr.c, 2}); } } if (curr.c - 1 >= 0) { if (dist[curr.r][curr.c - 1][2] > d + 1) { dist[curr.r][curr.c - 1][2] = d + 1; q.push({curr.r, curr.c - 1, 2}); } } } else if (curr.type == 1) { int dr[] = {0, 0}; int dc[] = {1, -1}; for (int i = 0; i < 2; i++) { int nr = curr.r, nc = curr.c + dc[i]; if (nc >= 0 && nc < W) { if (dist[nr][nc][1] > d + 1) { dist[nr][nc][1] = d + 1; q.push({nr, nc, 1}); } } } for (int nr : {curr.r, curr.r + 1}) { if (dist[nr][curr.c][0] > d + 1) { dist[nr][curr.c][0] = d + 1; q.push({nr, curr.c, 0}); } } } else if (curr.type == 2) { int dr[] = {1, -1}; int dc[] = {0, 0}; for (int i = 0; i < 2; i++) { int nr = curr.r + dr[i], nc = curr.c; if (nr >= 0 && nr < H) { if (dist[nr][nc][2] > d + 1) { dist[nr][nc][2] = d + 1; q.push({nr, nc, 2}); } } } for (int nc : {curr.c, curr.c + 1}) { if (dist[curr.r][nc][0] > d + 1) { dist[curr.r][nc][0] = d + 1; q.push({curr.r, nc, 0}); } } } } int result = dist[H - 1][W - 1][0]; if (result == INF) cout << -1 << endl; else cout << result << endl; return 0; }