#include using namespace std; 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]; auto id = [&](int i, int j) { return i * W + j; }; vector fromS(H * W, 0), toG(H * W, 0); // fromS for (int i = 0; i < H; i++) { for (int j = 0; j < W; j++) { if (C[i][j] == '#') continue; if (i == 0 && j == 0) { fromS[id(i, j)] = 1; } else { bool ok = false; if (i > 0 && fromS[id(i - 1, j)]) ok = true; if (j > 0 && fromS[id(i, j - 1)]) ok = true; fromS[id(i, j)] = ok; } } } // toG for (int i = H - 1; i >= 0; i--) { for (int j = W - 1; j >= 0; j--) { if (C[i][j] == '#') continue; if (i == H - 1 && j == W - 1) { toG[id(i, j)] = 1; } else { bool ok = false; if (i + 1 < H && toG[id(i + 1, j)]) ok = true; if (j + 1 < W && toG[id(i, j + 1)]) ok = true; toG[id(i, j)] = ok; } } } // 0回使用で最短 H+W-2 if (fromS[id(H - 1, W - 1)]) { cout << H + W - 2 << '\n'; return 0; } // 1行挿入で H+W-1 を作れるか for (int r = 0; r + 1 < H; r++) { vector suff(W + 1, 0); for (int j = W - 1; j >= 0; j--) { suff[j] = suff[j + 1] || toG[id(r + 1, j)]; } bool pref = false; for (int j = 0; j < W; j++) { pref = pref || fromS[id(r, j)]; if (pref && suff[j]) { cout << H + W - 1 << '\n'; return 0; } } } // 1列挿入で H+W-1 を作れるか for (int c = 0; c + 1 < W; c++) { vector suff(H + 1, 0); for (int i = H - 1; i >= 0; i--) { suff[i] = suff[i + 1] || toG[id(i, c + 1)]; } bool pref = false; for (int i = 0; i < H; i++) { pref = pref || fromS[id(i, c)]; if (pref && suff[i]) { cout << H + W - 1 << '\n'; return 0; } } } // それ以外は 2回使えば必ず H+W cout << H + W << '\n'; return 0; }