1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87
| #include <bits/stdc++.h>
const int kMaxN = 105;
int n, m; int a[kMaxN][kMaxN]; std::string s[kMaxN];
void dickdreamer() { std::cin >> n >> m; for (int i = 1; i <= n; ++i) { std::cin >> s[i]; s[i] = " " + s[i]; for (int j = 1; j <= m; ++j) { if (s[i][j] == 'W') a[i][j] = 0; else if (s[i][j] == 'B') a[i][j] = 1; else a[i][j] = -1; if ((i + j) % 2 && a[i][j] != -1) a[i][j] = 1 - a[i][j]; } } std::queue<std::tuple<int, int, int>> q; std::set<std::pair<int, int>> st; for (int i = 1; i <= n; ++i) { for (int j = 1; j <= m; ++j) { if (a[i][j] == -1) st.emplace(i, j); } } for (int i = 1; i < n; ++i) { for (int j = 1; j < m; ++j) { int sum = a[i][j] + a[i][j + 1] + a[i + 1][j] + a[i + 1][j + 1]; int cnt = (a[i][j] == -1) + (a[i][j + 1] == -1) + (a[i + 1][j] == -1) + (a[i + 1][j + 1] == -1); if (!cnt && (sum == 4 || sum == 0)) return void(std::cout << "NO\n"); if (cnt != 1) continue; int v = (sum + 1) != 3; if (a[i][j] == -1 && (sum + 1 == 3 || sum + 1 == 0)) a[i][j] = v, st.erase({i, j}), q.emplace(i, j, (sum + 1) != 3); if (a[i][j + 1] == -1 && (sum + 1 == 3 || sum + 1 == 0)) a[i][j + 1] = v, st.erase({i, j + 1}), q.emplace(i, j + 1, (sum + 1) != 3); if (a[i + 1][j] == -1 && (sum + 1 == 3 || sum + 1 == 0)) a[i + 1][j] = v, st.erase({i + 1, j}), q.emplace(i + 1, j, (sum + 1) != 3); if (a[i + 1][j + 1] == -1 && (sum + 1 == 3 || sum + 1 == 0)) a[i + 1][j + 1] = v, st.erase({i + 1, j + 1}), q.emplace(i + 1, j + 1, (sum + 1) != 3); } } for (; !q.empty() || !st.empty();) { if (q.empty()) { auto [x, y] = *st.begin(); q.emplace(x, y, 0), st.erase({x, y}); a[x][y] = 0; } auto [x, y, v] = q.front(); q.pop(); for (int i = std::max(x - 1, 1); i <= std::min(x, n - 1); ++i) { for (int j = std::max(y - 1, 1); j <= std::min(y, m - 1); ++j) { int sum = a[i][j] + a[i][j + 1] + a[i + 1][j] + a[i + 1][j + 1]; int cnt = (a[i][j] == -1) + (a[i][j + 1] == -1) + (a[i + 1][j] == -1) + (a[i + 1][j + 1] == -1); if (!cnt && (sum == 4 || sum == 0)) return void(std::cout << "NO\n"); if (cnt != 1) continue; int v = (sum + 1) != 3; if (a[i][j] == -1 && (sum + 1 == 3 || sum + 1 == 0)) a[i][j] = v, st.erase({i, j}), q.emplace(i, j, (sum + 1) != 3); if (a[i][j + 1] == -1 && (sum + 1 == 3 || sum + 1 == 0)) a[i][j + 1] = v, st.erase({i, j + 1}), q.emplace(i, j + 1, (sum + 1) != 3); if (a[i + 1][j] == -1 && (sum + 1 == 3 || sum + 1 == 0)) a[i + 1][j] = v, st.erase({i + 1, j}), q.emplace(i + 1, j, (sum + 1) != 3); if (a[i + 1][j + 1] == -1 && (sum + 1 == 3 || sum + 1 == 0)) a[i + 1][j + 1] = v, st.erase({i + 1, j + 1}), q.emplace(i + 1, j + 1, (sum + 1) != 3); } } } std::cout << "YES\n"; for (int i = 1; i <= n; ++i) { for (int j = 1; j <= m; ++j) { if ((i + j) % 2 && a[i][j] != -1) a[i][j] = 1 - a[i][j]; if (a[i][j] == 0) std::cout << 'W'; else if (a[i][j] == 1) std::cout << 'B'; else std::cout << '?'; } std::cout << '\n'; } }
int32_t main() { #ifdef ORZXKR freopen("in.txt", "r", stdin); freopen("out.txt", "w", stdout); #endif std::ios::sync_with_stdio(0), std::cin.tie(0), std::cout.tie(0); int T = 1; std::cin >> T; while (T--) dickdreamer(); return 0; }
|