#include #include #include #define MAXH 2005 #define MAXW 2005 static char g[MAXH][MAXW]; int main(void) { int H, W; scanf("%d %d", &H, &W); for (int i = 0; i < H; i++) { scanf("%s", g[i]); } int R = 2 * H - 1; int C = 2 * W - 1; int N = R * C; unsigned char *vis = (unsigned char *)calloc(N, 1); int *q = (int *)malloc(sizeof(int) * N); if (!vis || !q) return 0; int sr = 0, sc = 0; int gr = R - 1, gc = C - 1; int s = sr * C + sc; int t = gr * C + gc; int head = 0, tail = 0; q[tail++] = s; vis[s] = 1; int dist = 0; const int dr[4] = {-1, 1, 0, 0}; const int dc[4] = {0, 0, -1, 1}; while (head < tail) { int qs = tail - head; while (qs--) { int v = q[head++]; if (v == t) { printf("%d\n", dist); free(vis); free(q); return 0; } int r = v / C; int c = v % C; for (int dir = 0; dir < 4; dir++) { int nr = r + dr[dir]; int nc = c + dc[dir]; if (nr < 0 || nr >= R || nc < 0 || nc >= C) continue; if ((nr % 2 == 0) && (nc % 2 == 0)) { if (g[nr / 2][nc / 2] == '#') continue; } int ni = nr * C + nc; if (vis[ni]) continue; vis[ni] = 1; q[tail++] = ni; } } dist++; } printf("-1\n"); free(vis); free(q); return 0; }