#include #include #include #define MAXN 2002 #define MAXHW (MAXN * MAXN) int H, W; char grid[MAXN][MAXN]; int dist_arr[MAXHW]; int queue_arr[MAXHW]; char mS[MAXHW]; char mG[MAXHW]; static inline int idx(int i, int j) { return i * W + j; } void bfs0() { int HW = H * W; for (int i = 0; i < HW; i++) dist_arr[i] = -1; if (grid[0][0] == '#') return; dist_arr[0] = 0; int head = 0, tail = 0; queue_arr[tail++] = 0; while (head < tail) { int pos = queue_arr[head++]; int i = pos / W; int j = pos % W; int d = dist_arr[pos] + 1; if (i > 0) { int np = pos - W; if (dist_arr[np] == -1 && grid[i - 1][j] != '#') { dist_arr[np] = d; queue_arr[tail++] = np; } } if (i < H - 1) { int np = pos + W; if (dist_arr[np] == -1 && grid[i + 1][j] != '#') { dist_arr[np] = d; queue_arr[tail++] = np; } } if (j > 0) { int np = pos - 1; if (dist_arr[np] == -1 && grid[i][j - 1] != '#') { dist_arr[np] = d; queue_arr[tail++] = np; } } if (j < W - 1) { int np = pos + 1; if (dist_arr[np] == -1 && grid[i][j + 1] != '#') { dist_arr[np] = d; queue_arr[tail++] = np; } } } } int main() { scanf("%d %d", &H, &W); for (int i = 0; i < H; i++) scanf("%s", grid[i]); bfs0(); int d0 = dist_arr[idx(H - 1, W - 1)]; int best = (d0 < 0) ? H + W + 1 : d0; memset(mS, 0, H * W); if (grid[0][0] != '#') mS[0] = 1; for (int i = 0; i < H; i++) { for (int j = 0; j < W; j++) { if (i == 0 && j == 0) continue; if (grid[i][j] == '#') continue; if ((i > 0 && mS[idx(i - 1, j)]) || (j > 0 && mS[idx(i, j - 1)])) mS[idx(i, j)] = 1; } } memset(mG, 0, H * W); if (grid[H - 1][W - 1] != '#') mG[idx(H - 1, W - 1)] = 1; for (int i = H - 1; i >= 0; i--) { for (int j = W - 1; j >= 0; j--) { if (i == H - 1 && j == W - 1) continue; if (grid[i][j] == '#') continue; if ((i < H - 1 && mG[idx(i + 1, j)]) || (j < W - 1 && mG[idx(i, j + 1)])) mG[idx(i, j)] = 1; } } int one_ins = 0; for (int g = 0; g < H - 1 && !one_ins; g++) { int min_s = W, max_g = -1; for (int j = 0; j < W; j++) { if (mS[idx(g, j)] && j < min_s) min_s = j; if (mG[idx(g + 1, j)] && j > max_g) max_g = j; } if (min_s <= max_g) one_ins = 1; } for (int c = 0; c < W - 1 && !one_ins; c++) { int min_s = H, max_g = -1; for (int i = 0; i < H; i++) { if (mS[idx(i, c)] && i < min_s) min_s = i; if (mG[idx(i, c + 1)] && i > max_g) max_g = i; } if (min_s <= max_g) one_ins = 1; } if (one_ins && H + W - 1 < best) best = H + W - 1; if (H + W < best) best = H + W; printf("%d\n", best); return 0; }