#include #include #include #include #include #include #include #include #include #include #include #include using namespace std; // using namespace __gnu_cxx; typedef long long ll; typedef double db; typedef vector vi; typedef vector vs; typedef pair pii; #define INF (1<<30) #define PB push_back #define FI first #define SE second #define REP(i,n) for(int (i)=0;(i)<(n);++(i)) #define FUP(i,a,b) for(int (i)=(a);(i)<=(b);++(i)) #define FDN(i,a,b) for(int (i)=(a);(i)>=(b);--(i)) struct Pnt{ char c; int id,rea; char win; }; int n,e; const int zX[4] = {-1, 0, 1, 0}; const int zY[4] = {0, 1, 0, -1}; inline bool ok(int x, int y){ return (x >= 0 && x < n && y >= 0 && y < e); } Pnt tab[103][103]; int ID; int sklsize[20000]; int exam1x[20000]; int exam1y[20000]; int exam2x[20000]; int exam2y[20000]; int stosX[20000]; int stosY[20000]; int ww; void czysc(){ REP(i,ww){ tab[stosX[i]][stosY[i]].id = tab[stosX[i]][stosY[i]].rea; } ww=0; } void skladowe(int a, int b){ tab[a][b].id = ID; sklsize[ID]++; if(exam1x[ID] == -1){ exam1x[ID] = a; exam1y[ID] = b; } else if(exam2x[ID] == -1){ exam2x[ID] = a; exam2y[ID] = b; } REP(i,4){ int xx = a + zX[i]; int yy = b + zY[i]; if(ok(xx, yy) && tab[xx][yy].id == -1){ skladowe(xx, yy); } } } bool win(int a, int b){ //cout << "WIN " << a << " " << b << endl; tab[a][b].rea = tab[a][b].id; stosX[ww] = a; stosY[ww] = b; ww++; tab[a][b].id = -1; REP(i,4){ int xx = a + zX[i]; int yy = b + zY[i]; if(ok(xx, yy) && tab[xx][yy].id >= 0){ if(!win(xx,yy)) return true; } } return false; } void mark(int a, int b, bool rozne, bool jaki, int iid){ tab[a][b].win = jaki; tab[a][b].id = -1; REP(i,4){ int xx = a + zX[i]; int yy = b + zY[i]; if(ok(xx, yy) && tab[xx][yy].id == iid){ bool nowy = jaki; if(rozne) nowy = !nowy; mark(xx,yy,rozne, nowy, iid); } } } int main(){ while(true){ char c; scanf("%d%d", &n, &e); do c = getchar(); while(c!='\n'); if(n==0 && e==0) break; REP(i,n){ REP(j,e){ tab[i][j].c = getchar(); if(tab[i][j].c == '.') tab[i][j].id = -1; else tab[i][j].id = -10; } do c = getchar(); while(c!='\n'); } // skladowe ID = 0; exam1x[ID] = exam1y[ID] = exam2x[ID] = exam2y[ID] = -1; sklsize[ID] = 0; REP(i,n) REP(j,e){ if(tab[i][j].id == -1){ skladowe(i,j); ID++; exam1x[ID] = exam1y[ID] = exam2x[ID] = exam2y[ID] = -1; sklsize[ID] = 0; } } // dla kazdej skladowej dwa sasiednie pola REP(i,ID){ int x = exam1x[i]; int y = exam1y[i]; int xx,yy; tab[x][y].win = win(x,y); czysc(); if(sklsize[i] > 1){ xx = exam2x[i]; yy = exam2y[i]; tab[xx][yy].win = win(xx,yy); czysc(); bool rozne = (tab[x][y].win != tab[xx][yy].win); /*if(rozne) cout << "ROZNE" << endl; else cout << "NIE" << endl;*/ mark(x,y,rozne,tab[x][y].win, tab[x][y].id); } } REP(i,n){ REP(j,e){ char cc = tab[i][j].c; if(cc == 'X'){ putchar('X'); } else if(tab[i][j].win){ putchar('A'); } else { putchar('B'); } } putchar('\n'); } putchar('\n'); } return 0; }