#include<bits/stdc++.h> using namespace std; template<typename T, typename T2, typename T3> struct trio{ T first; T2 second; T3 third; }; const int N=2001; int board[N][N]; int Rcol[N][30]; int Kcol[N][30]; int Rvis[N]; int Kvis[N]; vector <trio <char, int, char> > ans; int main(){ ios_base::sync_with_stdio(false); cin.tie(0); cout.tie(0); int n, m; cin>>n>>m; int x; char a; for(int i=0; i<n; i++){ for(int j=0; j<m; j++){ cin>>a; x=(a-'A')+1; board[i][j]=x; Rcol[i][x]++; Kcol[j][x]++; } } int color, zp, cnt=n*m; bool same; char b; while(cnt>0){ for(int i=0; i<n; i++){ if(Rvis[i]) continue; same=true; zp=0; color=0; for(int j=0; j<27; j++){ if(j!=0&&Rcol[i][j]>0){ color=j; zp++; } if(zp>1){ same=false; break; } } if(same&&zp!=0){ Rvis[i]=true; cnt-=Rcol[i][color]; b=(color+'A')-1; ans.push_back({'R', i+1, b}); Rcol[i][0]=m; Rcol[i][color]=0; for(int j=0; j<m; j++){ Kcol[j][board[i][j]]--; } } } for(int i=0; i<m; i++){ if(Kvis[i]) continue; same=true; zp=0; color=0; for(int j=0; j<27; j++){ if(j!=0&&Kcol[i][j]>0){ color=j; zp++; } if(zp>1){ same=false; break; } } if(same&&zp!=0){ Kvis[i]=true; cnt-=Kcol[i][color]; b=(color+'A')-1; ans.push_back({'K', i+1, b}); Kcol[i][0]=n; Kcol[i][color]=0; for(int j=0; j<n; j++){ Rcol[j][board[j][i]]--; } } } } cout<<ans.size()<<"\n"; reverse(ans.begin(), ans.end()); for(int i=0; i<ans.size(); i++){ cout<<ans[i].first<<" "<<ans[i].second<<" "<<ans[i].third<<"\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 97 98 | #include<bits/stdc++.h> using namespace std; template<typename T, typename T2, typename T3> struct trio{ T first; T2 second; T3 third; }; const int N=2001; int board[N][N]; int Rcol[N][30]; int Kcol[N][30]; int Rvis[N]; int Kvis[N]; vector <trio <char, int, char> > ans; int main(){ ios_base::sync_with_stdio(false); cin.tie(0); cout.tie(0); int n, m; cin>>n>>m; int x; char a; for(int i=0; i<n; i++){ for(int j=0; j<m; j++){ cin>>a; x=(a-'A')+1; board[i][j]=x; Rcol[i][x]++; Kcol[j][x]++; } } int color, zp, cnt=n*m; bool same; char b; while(cnt>0){ for(int i=0; i<n; i++){ if(Rvis[i]) continue; same=true; zp=0; color=0; for(int j=0; j<27; j++){ if(j!=0&&Rcol[i][j]>0){ color=j; zp++; } if(zp>1){ same=false; break; } } if(same&&zp!=0){ Rvis[i]=true; cnt-=Rcol[i][color]; b=(color+'A')-1; ans.push_back({'R', i+1, b}); Rcol[i][0]=m; Rcol[i][color]=0; for(int j=0; j<m; j++){ Kcol[j][board[i][j]]--; } } } for(int i=0; i<m; i++){ if(Kvis[i]) continue; same=true; zp=0; color=0; for(int j=0; j<27; j++){ if(j!=0&&Kcol[i][j]>0){ color=j; zp++; } if(zp>1){ same=false; break; } } if(same&&zp!=0){ Kvis[i]=true; cnt-=Kcol[i][color]; b=(color+'A')-1; ans.push_back({'K', i+1, b}); Kcol[i][0]=n; Kcol[i][color]=0; for(int j=0; j<n; j++){ Rcol[j][board[j][i]]--; } } } } cout<<ans.size()<<"\n"; reverse(ans.begin(), ans.end()); for(int i=0; i<ans.size(); i++){ cout<<ans[i].first<<" "<<ans[i].second<<" "<<ans[i].third<<"\n"; } return 0; } |