#include <bits/stdc++.h> using namespace std; const int maxn = 2009; int n , m , a; string kon[maxn]; int r[30][maxn] , k[30][maxn]; int lr[maxn] , lk[maxn]; int visr[maxn] , visl[maxn]; queue <int> qr , qk; vector <pair<pair<char,char>,int>> res; int main() { ios_base::sync_with_stdio(0); cin.tie(0); cin >> n >> m; for(int i = 0 ; i < n ; i++)cin >> kon[i]; for(int i = 0 ; i < n ; i++) { for(int j = 0 ; j < m ; j++) { r[kon[i][j]-'A'][i]++; k[kon[i][j]-'A'][j]++; if(r[kon[i][j]-'A'][i] == 1)lr[i]++; if(k[kon[i][j]-'A'][j] == 1)lk[j]++; } } for(int i = 0 ; i < n ; i++) { if(lr[i] == 1) { qr.push(i); lr[i]--; } } for(int i = 0 ; i < m ; i++) { if(lk[i] == 1) { qk.push(i); lk[i]--; } } while(!qr.empty() || !qk.empty()) { while(!qr.empty()) { a = qr.front(); qr.pop(); char R = 0; for(int i = 0 ; i < 26 ; i++)if(r[i][a] > 0)R = i; res.push_back({{R+'A','R'},a}); lr[a]--; for(int i = 0 ; i < m ; i++) { k[kon[a][i]-'A'][i]--; if(k[kon[a][i]-'A'][i] == 0)lk[i]--; if(lk[i] == 1) { lk[i]--; qk.push(i); } } } while(!qk.empty()) { a = qk.front(); qk.pop(); char R = 0; for(int i = 0 ; i < 26 ; i++)if(k[i][a] > 0)R = i; res.push_back({{R+'A','K'},a}); lk[a]--; for(int i = 0 ; i < n ; i++) { r[kon[i][a]-'A'][i]--; if(r[kon[i][a]-'A'][i] == 0)lr[i]--; if(lr[i] == 1) { lr[i]--; qr.push(i); } } } } cout << res.size() << '\n'; for(int i = res.size()-1 ; i >=0 ; i--) { cout << res[i].first.second << ' ' << res[i].second+1 << ' ' << res[i].first.first << '\n'; } 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 | #include <bits/stdc++.h> using namespace std; const int maxn = 2009; int n , m , a; string kon[maxn]; int r[30][maxn] , k[30][maxn]; int lr[maxn] , lk[maxn]; int visr[maxn] , visl[maxn]; queue <int> qr , qk; vector <pair<pair<char,char>,int>> res; int main() { ios_base::sync_with_stdio(0); cin.tie(0); cin >> n >> m; for(int i = 0 ; i < n ; i++)cin >> kon[i]; for(int i = 0 ; i < n ; i++) { for(int j = 0 ; j < m ; j++) { r[kon[i][j]-'A'][i]++; k[kon[i][j]-'A'][j]++; if(r[kon[i][j]-'A'][i] == 1)lr[i]++; if(k[kon[i][j]-'A'][j] == 1)lk[j]++; } } for(int i = 0 ; i < n ; i++) { if(lr[i] == 1) { qr.push(i); lr[i]--; } } for(int i = 0 ; i < m ; i++) { if(lk[i] == 1) { qk.push(i); lk[i]--; } } while(!qr.empty() || !qk.empty()) { while(!qr.empty()) { a = qr.front(); qr.pop(); char R = 0; for(int i = 0 ; i < 26 ; i++)if(r[i][a] > 0)R = i; res.push_back({{R+'A','R'},a}); lr[a]--; for(int i = 0 ; i < m ; i++) { k[kon[a][i]-'A'][i]--; if(k[kon[a][i]-'A'][i] == 0)lk[i]--; if(lk[i] == 1) { lk[i]--; qk.push(i); } } } while(!qk.empty()) { a = qk.front(); qk.pop(); char R = 0; for(int i = 0 ; i < 26 ; i++)if(k[i][a] > 0)R = i; res.push_back({{R+'A','K'},a}); lk[a]--; for(int i = 0 ; i < n ; i++) { r[kon[i][a]-'A'][i]--; if(r[kon[i][a]-'A'][i] == 0)lr[i]--; if(lr[i] == 1) { lr[i]--; qr.push(i); } } } } cout << res.size() << '\n'; for(int i = res.size()-1 ; i >=0 ; i--) { cout << res[i].first.second << ' ' << res[i].second+1 << ' ' << res[i].first.first << '\n'; } return 0; } |