#include #include #include #define INF 65535 static char grid[2005][2005]; int main(void) { int H, W; scanf("%d %d", &H, &W); for (int i = 0; i < H; i++) { scanf("%s", grid[i]); } int R = 2 * H - 1; int C = 2 * W - 1; int total = R * C; // dist: uint16_t is enough because max shortest path <= (2H-2)+(2W-2) <= 7996 uint16_t *dist = (uint16_t *)malloc(sizeof(uint16_t) * total); uint32_t *q = (uint32_t *)malloc(sizeof(uint32_t) * total); if (!dist || !q) return 0; for (int i = 0; i < total; i++) dist[i] = INF; int sr = 0, sc = 0; int gr = R - 1, gc = C - 1; int sidx = sr * C + sc; int gidx = gr * C + gc; int head = 0, tail = 0; dist[sidx] = 0; q[tail++] = sidx; const int dr[4] = {-1, 1, 0, 0}; const int dc[4] = {0, 0, -1, 1}; while (head < tail) { uint32_t v = q[head++]; if ((int)v == gidx) break; int r = v / C; int c = v % C; uint16_t nd = dist[v] + 1; 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; // blocked only when both are even and original cell is '#' if ((nr % 2 == 0) && (nc % 2 == 0)) { if (grid[nr / 2][nc / 2] == '#') continue; } int ni = nr * C + nc; if (dist[ni] != INF) continue; dist[ni] = nd; q[tail++] = ni; } } if (dist[gidx] == INF) { printf("-1\n"); } else { printf("%u\n", dist[gidx]); } free(dist); free(q); return 0; }