#include #include #include #include #include #include #include #include using namespace std; #define FORC(it, V) for(__typeof((V).begin()) it = (V).begin(); it != (V).end(); ++it) typedef pair point; #define X first #define Y second const int MAXN = 101; int R, S; int ck; int bio[MAXN][MAXN]; int bio2[MAXN][MAXN]; char grid[MAXN][MAXN+1]; char sol[MAXN][MAXN+1]; vector P[2]; point dad[MAXN][MAXN]; const int dx[4] = { -1, 0, 1, 0 }; const int dy[4] = { 0, 1, 0, -1 }; inline int valid(int x, int y) { if (x < 0 || y < 0 || x >= R || y >= S) return false; return true; } void fill(int x, int y) { bio[x][y] = true; P[(x+y)%2].push_back(point(x,y)); dad[x][y] = point(-1, -1); for (int pc = 0; pc < 4; ++pc) { int nx = x + dx[pc]; int ny = y + dy[pc]; if (!valid(nx, ny)) continue; if (grid[nx][ny] == 'X') continue; if (bio[nx][ny]) continue; fill(nx, ny); } } point sidro; int match(int x, int y) { if (x == -1) return true; if (bio2[x][y] == ck) return false; bio2[x][y] = ck; for (int pc = 0; pc < 4; ++pc) { int nx = x + dx[pc]; int ny = y + dy[pc]; if (!valid(nx, ny)) continue; if (grid[nx][ny] == 'X') continue; if (sidro.X == nx && sidro.Y == ny) continue; // printf("nx = %d ny = %d\n", nx, ny); if (match(dad[nx][ny].X, dad[nx][ny].Y)) { dad[nx][ny] = point(x, y); return true; } } return false; } int main(void) { for (; scanf("%d %d", &R, &S) == 2; ) { if (R+S == 0) break; for (int i = 0; i < R; ++i) { scanf("%s", grid[i]); strcpy(sol[i], grid[i]); } ck = 2; memset(bio, 0, sizeof bio); memset(bio2, 0, sizeof bio2); for (int x = 0; x < R; ++x) for (int y = 0; y < S; ++y) { if (grid[x][y] == 'X') continue; if (bio[x][y]) continue; P[0].clear(); P[1].clear(); fill(x, y); for (int c = 0; c < 2; ++c) { deque Q; int sum = 0; FORC(it, P[c^1]) { ++ck; sidro = point(-2, -2); int t = match(it->X, it->Y); if (t == 0) { Q.push_back(*it); } sum += t; } // printf("c = %d prije sum = %d\n", c, sum); // for (int i = 0; i < R; ++i, putchar('\n')) // for (int j = 0; j < S; ++j) // printf("(%d,%d) ", dad[i][j].X, dad[i][j].Y); FORC(it, P[c]) { point s = dad[it->X][it->Y]; dad[it->X][it->Y] = point(-1, -1); if (s.X != -1) { Q.push_back(s); --sum; } // printf("maknuo sum = %d\n", sum); sidro = *it; while (Q.size()) { point ex = Q.front(); ++ck; int t = match(ex.X, ex.Y); // printf("matchao ex = (%d, %d)\n", ex.X, ex.Y); // return (0-0); if (t) { Q.pop_front(); ++sum; } else { break; } } // printf("sum = %d P = %d, %d\n", sum, P[0].size(), P[1].size()); if (sum == (int)P[c^1].size()) sol[it->X][it->Y] = 'B'; else sol[it->X][it->Y] = 'A'; } } } for (int i = 0; i < R; ++i) puts(sol[i]); putchar('\n'); } return 0; }