#include <bits/stdc++.h> using namespace std; int height, width; int columns[2000][26]; int columnsDifferent[2000]; int rows[2000][26]; int rowsDifferent[2000]; int board[2000][2000]; queue<int> current; vector<pair<int, int>> steps; int main() { ios_base::sync_with_stdio(false); cin.tie(0); cin >> height >> width; for (int i = 0; i < height; ++i) { for (int j = 0; j < width; ++j) { char color; cin >> color; int colorIndex = color - 'A'; board[i][j] = colorIndex; if (rows[i][colorIndex] == 0) ++rowsDifferent[i]; if (columns[j][colorIndex] == 0) ++columnsDifferent[j]; rows[i][colorIndex] += 1; columns[j][colorIndex] += 1; } } for (int i = 0; i < height; ++i) { if (rowsDifferent[i] == 1) { current.emplace(i); } } for (int i = 0; i < width; ++i) { if (columnsDifferent[i] == 1) { current.emplace(i + 2000); } } while (!current.empty()) { int element = current.front(); current.pop(); if (element < 2000) { int painted = -1; for (int p = 0; p < 26; ++p) { if (rows[element][p] != 0) { painted = p; break; } } if (painted == -1) continue; steps.emplace_back(element, painted); for (int i = 0; i < width; ++i) { int color = board[element][i]; if (color != -1) { --columns[i][color]; if (columns[i][color] == 0) { --columnsDifferent[i]; if (columnsDifferent[i] == 1) current.push(i + 2000); } board[element][i] = -1; } } } else { int painted = -1; for (int p = 0; p < 26; ++p) { if (columns[element - 2000][p] != 0) { painted = p; break; } } if (painted == -1) continue; steps.emplace_back(element, painted); for (int i = 0; i < height; ++i) { int color = board[i][element - 2000]; if (color != -1) { --rows[i][color]; // cout << i << ' ' << (element - 2000) << ' ' << color << ' ' << rows[i][color] << '\n'; if (rows[i][color] == 0) { --rowsDifferent[i]; if (rowsDifferent[i] == 1) current.push(i); } board[i][element - 2000] = -1; } } } } cout << steps.size() << '\n'; for (int i = steps.size() - 1; i >= 0; --i) { auto step = steps[i]; if (step.first < 2000) { cout << "R " << (step.first + 1) << ' ' << (char) (step.second + 'A') << '\n'; } else { cout << "K " << (step.first - 2000 + 1) << ' ' << (char) (step.second + 'A') << '\n'; } } }
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 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 | #include <bits/stdc++.h> using namespace std; int height, width; int columns[2000][26]; int columnsDifferent[2000]; int rows[2000][26]; int rowsDifferent[2000]; int board[2000][2000]; queue<int> current; vector<pair<int, int>> steps; int main() { ios_base::sync_with_stdio(false); cin.tie(0); cin >> height >> width; for (int i = 0; i < height; ++i) { for (int j = 0; j < width; ++j) { char color; cin >> color; int colorIndex = color - 'A'; board[i][j] = colorIndex; if (rows[i][colorIndex] == 0) ++rowsDifferent[i]; if (columns[j][colorIndex] == 0) ++columnsDifferent[j]; rows[i][colorIndex] += 1; columns[j][colorIndex] += 1; } } for (int i = 0; i < height; ++i) { if (rowsDifferent[i] == 1) { current.emplace(i); } } for (int i = 0; i < width; ++i) { if (columnsDifferent[i] == 1) { current.emplace(i + 2000); } } while (!current.empty()) { int element = current.front(); current.pop(); if (element < 2000) { int painted = -1; for (int p = 0; p < 26; ++p) { if (rows[element][p] != 0) { painted = p; break; } } if (painted == -1) continue; steps.emplace_back(element, painted); for (int i = 0; i < width; ++i) { int color = board[element][i]; if (color != -1) { --columns[i][color]; if (columns[i][color] == 0) { --columnsDifferent[i]; if (columnsDifferent[i] == 1) current.push(i + 2000); } board[element][i] = -1; } } } else { int painted = -1; for (int p = 0; p < 26; ++p) { if (columns[element - 2000][p] != 0) { painted = p; break; } } if (painted == -1) continue; steps.emplace_back(element, painted); for (int i = 0; i < height; ++i) { int color = board[i][element - 2000]; if (color != -1) { --rows[i][color]; // cout << i << ' ' << (element - 2000) << ' ' << color << ' ' << rows[i][color] << '\n'; if (rows[i][color] == 0) { --rowsDifferent[i]; if (rowsDifferent[i] == 1) current.push(i); } board[i][element - 2000] = -1; } } } } cout << steps.size() << '\n'; for (int i = steps.size() - 1; i >= 0; --i) { auto step = steps[i]; if (step.first < 2000) { cout << "R " << (step.first + 1) << ' ' << (char) (step.second + 'A') << '\n'; } else { cout << "K " << (step.first - 2000 + 1) << ' ' << (char) (step.second + 'A') << '\n'; } } } |