#include<bits/stdc++.h> using namespace std; using LL=long long; #define FOR(i,l,r)for(int i=(l);i<=(r);++i) #define REP(i,n)FOR(i,0,(n)-1) #define ssize(x)int(x.size()) #ifdef DEBUG auto operator<<(auto&o,auto x)->decltype(x.end(),o); auto&operator<<(auto&o,pair<auto,auto>p){return o<<"("<<p.first<<", "<<p.second<<")";} auto&operator<<(auto&o,tuple<auto,auto,auto>t){return o<<"("<<get<0>(t)<<", "<<get<1>(t)<<", "<<get<2>(t)<<")";} auto&operator<<(auto&o,tuple<auto,auto,auto,auto>t){return o<<"("<<get<0>(t)<<", "<<get<1>(t)<<", "<<get<2>(t)<<", "<<get<3>(t)<<")";} auto operator<<(auto&o,auto x)->decltype(x.end(),o){o<<"{";int i=0;for(auto e:x)o<<","+!i++<<e;return o<<"}";} #define debug(X...)cerr<<"["#X"]: ",[](auto...$){((cerr<<$<<"; "),...)<<endl;}(X) #else #define debug(...){} #endif int main() { cin.tie(0)->sync_with_stdio(0); int n, m; cin >> n >> m; vector board(n, vector(m, -1)); REP(i, n) { REP(j, m) { char x; cin >> x; board[i][j] = x - 'A'; } } debug(n, m, board); const int L = 26; vector row(n, vector(L, 0)), col(m, vector(L, 0)); REP(i, n) { REP(j, m) { ++row[i][board[i][j]]; ++col[j][board[i][j]]; } } vector<tuple<bool, int, int>> moves; vector<bool> active_row(n, true), active_col(m, true); int nn = n, mm = m; while (nn and mm) { bool found = false; REP(i, n) { if (not active_row[i]) continue; int cnt = 0, val = -1; REP(j, L) { if (row[i][j]) { val = j; ++cnt; } } if (cnt > 1) continue; found = true; --nn; moves.emplace_back(true, i, val); active_row[i] = false; REP(j, m) { --col[j][board[i][j]]; } break; } if (found) continue; REP(i, m) { if (not active_col[i]) continue; int cnt = 0, val = -1; REP(j, L) { if (col[i][j]) { val = j; ++cnt; } } if (cnt > 1) continue; found = true; --mm; moves.emplace_back(false, i, val); active_col[i] = false; REP(j, n) { --row[j][board[j][i]]; } break; } assert(found); } reverse(moves.begin(), moves.end()); cout << ssize(moves) << '\n'; for (auto [a, b, c] : moves) cout << (a ? 'R' : 'K') << ' ' << b + 1 << ' ' << char('A' + c) << '\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 | #include<bits/stdc++.h> using namespace std; using LL=long long; #define FOR(i,l,r)for(int i=(l);i<=(r);++i) #define REP(i,n)FOR(i,0,(n)-1) #define ssize(x)int(x.size()) #ifdef DEBUG auto operator<<(auto&o,auto x)->decltype(x.end(),o); auto&operator<<(auto&o,pair<auto,auto>p){return o<<"("<<p.first<<", "<<p.second<<")";} auto&operator<<(auto&o,tuple<auto,auto,auto>t){return o<<"("<<get<0>(t)<<", "<<get<1>(t)<<", "<<get<2>(t)<<")";} auto&operator<<(auto&o,tuple<auto,auto,auto,auto>t){return o<<"("<<get<0>(t)<<", "<<get<1>(t)<<", "<<get<2>(t)<<", "<<get<3>(t)<<")";} auto operator<<(auto&o,auto x)->decltype(x.end(),o){o<<"{";int i=0;for(auto e:x)o<<","+!i++<<e;return o<<"}";} #define debug(X...)cerr<<"["#X"]: ",[](auto...$){((cerr<<$<<"; "),...)<<endl;}(X) #else #define debug(...){} #endif int main() { cin.tie(0)->sync_with_stdio(0); int n, m; cin >> n >> m; vector board(n, vector(m, -1)); REP(i, n) { REP(j, m) { char x; cin >> x; board[i][j] = x - 'A'; } } debug(n, m, board); const int L = 26; vector row(n, vector(L, 0)), col(m, vector(L, 0)); REP(i, n) { REP(j, m) { ++row[i][board[i][j]]; ++col[j][board[i][j]]; } } vector<tuple<bool, int, int>> moves; vector<bool> active_row(n, true), active_col(m, true); int nn = n, mm = m; while (nn and mm) { bool found = false; REP(i, n) { if (not active_row[i]) continue; int cnt = 0, val = -1; REP(j, L) { if (row[i][j]) { val = j; ++cnt; } } if (cnt > 1) continue; found = true; --nn; moves.emplace_back(true, i, val); active_row[i] = false; REP(j, m) { --col[j][board[i][j]]; } break; } if (found) continue; REP(i, m) { if (not active_col[i]) continue; int cnt = 0, val = -1; REP(j, L) { if (col[i][j]) { val = j; ++cnt; } } if (cnt > 1) continue; found = true; --mm; moves.emplace_back(false, i, val); active_col[i] = false; REP(j, n) { --row[j][board[j][i]]; } break; } assert(found); } reverse(moves.begin(), moves.end()); cout << ssize(moves) << '\n'; for (auto [a, b, c] : moves) cout << (a ? 'R' : 'K') << ' ' << b + 1 << ' ' << char('A' + c) << '\n'; } |