#include #include #include #include using namespace std; int main() { const int dx[] = {0, 1, 0, -1}, dy[] = {1, 0, -1, 0}; int h, w; cin >> h >> w; vector s(h); for (int i = 0; i < h; ++i) cin >> s[i]; auto bfs = [&](int sx, int sy) -> vector> { vector> dis(h, vector (w, 1e9)); queue> q; dis[sx][sy] = 0; for (q.push({sx, sy}); !q.empty(); q.pop()) { auto [x, y] = q.front(); for (int i = 0; i < 4; ++i) { unsigned nx = x + dx[i], ny = y + dy[i]; if (nx >= h || ny >= w || s[nx][ny] == '#' || dis[nx][ny] <= dis[x][y] + 1) continue; dis[nx][ny] = dis[x][y] + 1; q.push({nx, ny}); } } return dis; }; vector> diss = bfs(0, 0), disg = bfs(h - 1, w - 1); for (int i = 0; i < h; ++i) for (int j = 0; j < w; ++j) ++disg[i][j]; int ans = min(h + w - 1, diss[h - 1][w - 1]); for (int i = 0; i < h - 1; ++i) { int mi = 1e9; for (int j = 0; j < w; ++j) { mi = min(mi, disg[i + 1][j]) + 1; ans = min(ans, diss[i][j] + mi); } mi = 1e9; for (int j = w - 1; j >= 0; --j) { mi = min(mi, disg[i + 1][j]) + 1; ans = min(ans, diss[i][j] + mi); } } for (int i = 0; i < w - 1; ++i) { int mi = 1e9; for (int j = 0; j < h; ++j) { mi = min(mi, disg[j][i + 1]) + 1; ans = min(ans, diss[j][i] + mi); } mi = 1e9; for (int j = h - 1; j >= 0; --j) { mi = min(mi, disg[j][i + 1]) + 1; ans = min(ans, diss[j][i] + mi); } } cout << ans << endl; }