/** * Patryk Kisielewski * * Potyczki Algorytmiczne 2024 * Zadanie: LAM - Łamigłówka 3 [C] */ #include <stack> #include <queue> #include <map> #include <vector> #include <utility> #include <cstdio> #include <iostream> #include <sstream> using namespace std; int n, m; vector<map<char,int>> mapK; vector<map<char,int>> mapR; stack<string> steps; queue<pair<char,int>> q; void removeK(int i) { char c = (*(mapK[i].begin())).first; steps.push("K " + to_string(i + 1) + " " + c); mapK[i].erase(c); for (int i = 0; i < n; ++i) { auto it = mapR[i].find(c); if (it == mapR[i].end()) continue; int current = --(*it).second; if (current == 0) { mapR[i].erase(it); } if (mapR[i].size() == 1) { q.push({'R', i}); } } } void removeR(int i) { char c = (*(mapR[i].begin())).first; steps.push("R " + to_string(i + 1) + " " + c); mapR[i].erase(c); for (int i = 0; i < m; ++i) { auto it = mapK[i].find(c); if (it == mapK[i].end()) continue; int current = --(*it).second; if (current == 0) { mapK[i].erase(it); } if (mapK[i].size() == 1) { q.push({'K', i}); } } } bool run() { vector<int> vK; vector<int> vR; while (!q.empty()) { auto& top = q.front(); q.pop(); if (top.first == 'K') { vK.push_back(top.second); } else { vR.push_back(top.second); } } for (int i : vK) { if (mapK[i].size() != 1) continue; removeK(i); } for (int i : vR) { if (mapR[i].size() != 1) continue; removeR(i); } if (vK.size() || vR.size()) return true; return false; } int main() { ios_base::sync_with_stdio(false); cin.tie(nullptr); cin >> n >> m; mapK = vector<map<char,int>>(m); mapR = vector<map<char,int>>(n); char c; for (int i = 0; i < n; ++i) { for (int j = 0; j < m; ++j) { cin >> c; ++mapK[j][c]; ++mapR[i][c]; } } for (int i = 0; i < m; ++i) if (mapK[i].size() == 1) q.push({'K', i}); for (int i = 0; i < n; ++i) if (mapR[i].size() == 1) q.push({'R', i}); while (run()); cout << steps.size() << endl; while (!steps.empty()) { cout << steps.top() << endl; steps.pop(); } return 0; }
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 | /** * Patryk Kisielewski * * Potyczki Algorytmiczne 2024 * Zadanie: LAM - Łamigłówka 3 [C] */ #include <stack> #include <queue> #include <map> #include <vector> #include <utility> #include <cstdio> #include <iostream> #include <sstream> using namespace std; int n, m; vector<map<char,int>> mapK; vector<map<char,int>> mapR; stack<string> steps; queue<pair<char,int>> q; void removeK(int i) { char c = (*(mapK[i].begin())).first; steps.push("K " + to_string(i + 1) + " " + c); mapK[i].erase(c); for (int i = 0; i < n; ++i) { auto it = mapR[i].find(c); if (it == mapR[i].end()) continue; int current = --(*it).second; if (current == 0) { mapR[i].erase(it); } if (mapR[i].size() == 1) { q.push({'R', i}); } } } void removeR(int i) { char c = (*(mapR[i].begin())).first; steps.push("R " + to_string(i + 1) + " " + c); mapR[i].erase(c); for (int i = 0; i < m; ++i) { auto it = mapK[i].find(c); if (it == mapK[i].end()) continue; int current = --(*it).second; if (current == 0) { mapK[i].erase(it); } if (mapK[i].size() == 1) { q.push({'K', i}); } } } bool run() { vector<int> vK; vector<int> vR; while (!q.empty()) { auto& top = q.front(); q.pop(); if (top.first == 'K') { vK.push_back(top.second); } else { vR.push_back(top.second); } } for (int i : vK) { if (mapK[i].size() != 1) continue; removeK(i); } for (int i : vR) { if (mapR[i].size() != 1) continue; removeR(i); } if (vK.size() || vR.size()) return true; return false; } int main() { ios_base::sync_with_stdio(false); cin.tie(nullptr); cin >> n >> m; mapK = vector<map<char,int>>(m); mapR = vector<map<char,int>>(n); char c; for (int i = 0; i < n; ++i) { for (int j = 0; j < m; ++j) { cin >> c; ++mapK[j][c]; ++mapR[i][c]; } } for (int i = 0; i < m; ++i) if (mapK[i].size() == 1) q.push({'K', i}); for (int i = 0; i < n; ++i) if (mapR[i].size() == 1) q.push({'R', i}); while (run()); cout << steps.size() << endl; while (!steps.empty()) { cout << steps.top() << endl; steps.pop(); } return 0; } |