#include #include #include #include using namespace std; const int INF = 1e9; int main() { 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))); deque, int>> dq; dist[0][0][0] = 0; dq.push_front({{0, 0}, 0}); int dr[] = {0, 0, 1, -1}; int dc[] = {1, -1, 0, 0}; while (!dq.empty()) { int r = dq.front().first.first; int c = dq.front().first.second; int s = dq.front().second; int d = dist[r][c][s]; dq.pop_front(); if (s == 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 && C[nr][nc] != '#') { if (dist[nr][nc][0] > d + 1) { dist[nr][nc][0] = d + 1; dq.push_back({{nr, nc}, 0}); } } } if (dist[r][c][1] > d + 1) { dist[r][c][1] = d + 1; dq.push_back({{r, c}, 1}); } if (dist[r][c][2] > d + 1) { dist[r][c][2] = d + 1; dq.push_back({{r, c}, 2}); } } else if (s == 1) { for (int nc : {c - 1, c + 1}) { if (nc >= 0 && nc < W) { if (dist[r][nc][1] > d + 1) { dist[r][nc][1] = d + 1; dq.push_back({{r, nc}, 1}); } } } for (int nr : {r, r + 1}) { if (nr >= 0 && nr < H) { if (dist[nr][c][0] > d + 1) { dist[nr][c][0] = d + 1; dq.push_back({{nr, c}, 0}); } } } } else if (s == 2) { for (int nr : {r - 1, r + 1}) { if (nr >= 0 && nr < H) { if (dist[nr][c][2] > d + 1) { dist[nr][c][2] = d + 1; dq.push_back({{nr, c}, 2}); } } } for (int nc : {c, c + 1}) { if (nc >= 0 && nc < W) { if (dist[r][nc][0] > d + 1) { dist[r][nc][0] = d + 1; dq.push_back({{r, nc}, 0}); } } } } } int ans = dist[H - 1][W - 1][0]; cout << (ans == INF ? -1 : ans) << endl; return 0; }