#include #include #include #define MAXN 2001 #define MAXHW (MAXN*MAXN) int H, W; char grid[MAXN][MAXN+1]; int dist[MAXHW]; char vis[MAXHW]; char inq[MAXHW]; int queue[MAXHW]; int pend[MAXN][MAXN]; // pend[row] = list of positions int pend_cnt[MAXN]; static inline int pos(int i, int j) { return i*W+j; } int bfs0() { memset(dist, -1, sizeof(int)*H*W); if (grid[0][0] == '#') return -1; dist[0] = 0; int head=0, tail=0; queue[tail++] = 0; int dirs[4][2] = {{-1,0},{1,0},{0,-1},{0,1}}; while (head < tail) { int p = queue[head++]; int i=p/W, j=p%W, d=dist[p]+1; for (int k=0;k<4;k++) { int ni=i+dirs[k][0], nj=j+dirs[k][1]; if (ni>=0&&ni=0&&nj=0); row+=(forward?1:-1)) { int nrow = forward ? row+1 : row-1; int head=0, tail=0; for (int k=0;k=0&&ni=0&&nj=row) q2[tail++]=np; else if (ni==nrow && nrow>=0) pend[nrow][pend_cnt[nrow]++]=np; } } } } } } } void rbfs_col(int start, int forward, char* vis_out) { memset(vis_out, 0, H*W); memset(inq, 0, H*W); for (int i=0;i=0); col+=(forward?1:-1)) { int ncol = forward ? col+1 : col-1; int head=0, tail=0; for (int k=0;k=0&&ni=0&&nj=col) q2[tail++]=np; else if (nj==ncol && ncol>=0) pend[ncol][pend_cnt[ncol]++]=np; } } } } } } } static char vt[MAXHW], vb[MAXHW], vl[MAXHW], vr[MAXHW]; int main() { scanf("%d %d", &H, &W); for (int i=0;i