#include //#include using namespace std; // using namespace atcoder; // using mint = modint1000000007; // const int mod = 1000000007; // using mint = modint998244353; // const int mod = 998244353; const int INF = 1e9; // const long long LINF = 1e18; #define rep(i, n) for (int i = 0; i < (n); ++i) #define rep2(i, l, r) for (int i = (l); i < (r); ++i) #define rrep(i, n) for (int i = (n)-1; i >= 0; --i) #define rrep2(i, l, r) for (int i = (r)-1; i >= (l); --i) #define all(x) (x).begin(), (x).end() #define allR(x) (x).rbegin(), (x).rend() #define P pair template inline bool chmax(A &a, const B &b) { if (a < b) { a = b; return true; } return false; } template inline bool chmin(A &a, const B &b) { if (a > b) { a = b; return true; } return false; } int main() { std::ios::sync_with_stdio(false); std::cin.tie(nullptr); // H+W-2 判定はeasy // H+W-1 ??? // H+W 絶対に行ける int h, w; cin >> h >> w; vectors(h); rep(i, h)cin >> s[i]; vector dp(h, vector(w)); { dp[0][0] = true; rep(i, h)rep(j, w)if (dp[i][j]) { if (i != h - 1) { int ni = i + 1; int nj = j + 0; if (s[ni][nj] != '#')dp[ni][nj] = true; } if (j != w - 1) { int ni = i + 0; int nj = j + 1; if (s[ni][nj] != '#')dp[ni][nj] = true; } } } vector dp2(h, vector(w)); { dp2[h - 1][w - 1] = true; rrep(i, h)rrep(j, w)if (dp2[i][j]) { if (i != 0) { int ni = i - 1; int nj = j + 0; if (s[ni][nj] != '#')dp2[ni][nj] = true; } if (j != 0) { int ni = i + 0; int nj = j - 1; if (s[ni][nj] != '#')dp2[ni][nj] = true; } } } if (dp[h - 1][w - 1]) { cout << h + w - 2 << endl; return 0; } { rep(i, h - 1) { int mn = INF; int mx = -INF; rep(j, w)if (dp[i][j])chmin(mn, j); rep(j, w)if (dp2[i + 1][j])chmax(mx, j); if (mn <= mx) { cout << h + w - 1 << endl; return 0; } } rep(j, w - 1) { int mn = INF; int mx = -INF; rep(i, h)if (dp[i][j])chmin(mn, j); rep(i, h)if (dp2[i][j + 1])chmax(mx, j); if (mn <= mx) { cout << h + w - 1 << endl; return 0; } } } cout << h + w << endl; return 0; }