Link to this code:
https://cses.fi/paste/c505ba9e8a3fa1a5c5d95d//* 777 */
#include <bits/stdc++.h>
using namespace std;
using VC = vector <char>;
using VCC = vector <VC>;
#define PRINTVec(arr) {for(auto& x:arr)cout<<x;cout<<'\n';}
#define PRINTGrid(grid) {for(auto& row:grid)PRINTVec(row);}
int R, C;
VCC grid;
bool possible = 1;
char ltrs[4] = {'A','B','C','D'};
void rec(int r, int c) {
if (r == R) return;
if (c == C) {
rec(r + 1, 0);
return;
}
set<char> st = {grid[r][c]};
if (r) st.insert(grid[r - 1][c]);
if (c) st.insert(grid[r][c - 1]);
for (auto& ltr : ltrs) if (!st.count(ltr)) {
grid[r][c] = ltr;
rec(r, c + 1);
return;
}
possible = 0;
}
int main() {
cin >> R >> C;
grid.resize(R, VC(C));
for (auto& row: grid) for (auto& x: row) cin >> x;
rec(0, 0);
if (possible) PRINTGrid(grid)
else cout << "IMPOSSIBLE";
return 0;
}