#define debug if(0) #include #include #include #include #include #include using namespace std; #define REP(i,n) for(int i = 0;i<(n);i++) #define FOREACH(it,u) for(vector ::iterator it = u.begin();it != u.end();it++) #define PB push_back typedef long long LL; const int N = 10000; char in[200][200]; int n1, n2; vector g[N]; int m1[N], m2[N]; bool c[N]; int blocked; bool dfs(int u) { if(u<0) return true; if (c[u]) return false; else c[u]=true; FOREACH(v, g[u]) { if (*v == blocked) continue; if (dfs(m2[*v])) {m1[u]=*v;m2[*v] = u; return true; } } return false; } int matching() { REP(i,n1) m1[i]=-1; REP(i,n2) m2[i] = -1; bool changed; do { changed = 0; REP(i,n1) c[i]=false; REP(i,n1) if(i != blocked && m1[i]<0) changed |= dfs(i); } while(changed); int siz = 0; REP(i,n1) siz += (m1[i] !=-1); return siz; } void clear(int ilv) { REP(i,ilv) g[i].clear(); } int dx[] = {-1,0,1,0}; int dy[] = {0,-1,0,1}; bool solve(){ int n, m; scanf("%d %d", &n, &m); if (n == 0 && m == 0) return false; REP(i,n) { scanf("%s", in[i]); } blocked = -1; debug printf("n=%d, m=%d\n", n, m); n1 = n*m; n2 = n*m; REP(i,n) { REP(j,m) { if ((i+j)%2 == 0 && in[i][j]=='.') { REP(k,4) { int ni = i + dy[k]; int nj = j + dx[k]; if (ni < 0 || ni >= n || nj < 0 || nj >= m || in[ni][nj] == 'X') continue; debug printf("edge: %d -> %d\n", i*m+j, ni*m+nj); g[i*m+j].PB(ni * m + nj); } } } } int total = matching(); debug printf("total=%d\n", total); REP(i,n) { REP(j,m) { if (in[i][j] == 'X') { printf("X"); continue; } blocked = i*m+j; int res = matching(); printf("%s", (res == total)?("B"):("A")); } printf("\n"); } printf("\n"); clear(n1); return true; } main(){ while(1){ if(!solve()) break; } return 0; }