/* 2024
* Maciej Szeptuch
*/
#include <cstdio>
#include <vector>
const int MAX_SIZE = 2001;
int width;
int height;
bool waiting_row[MAX_SIZE];
bool waiting_col[MAX_SIZE];
char row[MAX_SIZE][MAX_SIZE];
std::vector<std::pair<int, char>> action;
std::vector<int> que;
void scan_row(int h);
void scan_col(int w);
int abs(int a);
int main(void)
{
scanf("%d %d", &height, &width);
for(int h = 0; h < height; ++h)
scanf("%s", row[h]);
for(int h = 0; h < height; ++h)
scan_row(h);
for(int w = 0; w < width; ++w)
scan_col(w);
while(!que.empty())
{
int o = que.back();
que.pop_back();
if(o < 0) // row
{
waiting_row[-o - 1] = false;
scan_row(-o - 1);
continue;
}
// column
waiting_col[o - 1] = false;
scan_col(o - 1);
}
printf("%lu\n", action.size());
for(int a = action.size() - 1; a >= 0; --a)
printf("%c %d %c\n", action[a].first < 0 ? 'R' : 'K', abs(action[a].first), action[a].second);
return 0;
}
inline void scan_row(int h)
{
char color = '?';
for(int w = 0; w < width; ++w)
{
if(color == '?')
color = row[h][w];
else if(row[h][w] != '?' && color != row[h][w])
return;
}
if(color == '?')
return;
action.push_back({-h - 1, color});
for(int w = 0; w < width; ++w)
if(row[h][w] != '?')
{
row[h][w] = '?';
if(!waiting_col[w])
{
waiting_col[w] = true;
que.push_back(w + 1);
}
}
}
inline void scan_col(int w)
{
char color = '?';
for(int h = 0; h < height; ++h)
{
if(color == '?')
color = row[h][w];
else if(row[h][w] != '?' && color != row[h][w])
return;
}
if(color == '?')
return;
action.push_back({w + 1, color});
for(int h = 0; h < height; ++h)
if(row[h][w] != '?')
{
row[h][w] = '?';
if(!waiting_row[h])
{
waiting_row[h] = true;
que.push_back(-h - 1);
}
}
}
inline int abs(int a)
{
return a < 0 ? -a : a;
}
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 | /* 2024 * Maciej Szeptuch */ #include <cstdio> #include <vector> const int MAX_SIZE = 2001; int width; int height; bool waiting_row[MAX_SIZE]; bool waiting_col[MAX_SIZE]; char row[MAX_SIZE][MAX_SIZE]; std::vector<std::pair<int, char>> action; std::vector<int> que; void scan_row(int h); void scan_col(int w); int abs(int a); int main(void) { scanf("%d %d", &height, &width); for(int h = 0; h < height; ++h) scanf("%s", row[h]); for(int h = 0; h < height; ++h) scan_row(h); for(int w = 0; w < width; ++w) scan_col(w); while(!que.empty()) { int o = que.back(); que.pop_back(); if(o < 0) // row { waiting_row[-o - 1] = false; scan_row(-o - 1); continue; } // column waiting_col[o - 1] = false; scan_col(o - 1); } printf("%lu\n", action.size()); for(int a = action.size() - 1; a >= 0; --a) printf("%c %d %c\n", action[a].first < 0 ? 'R' : 'K', abs(action[a].first), action[a].second); return 0; } inline void scan_row(int h) { char color = '?'; for(int w = 0; w < width; ++w) { if(color == '?') color = row[h][w]; else if(row[h][w] != '?' && color != row[h][w]) return; } if(color == '?') return; action.push_back({-h - 1, color}); for(int w = 0; w < width; ++w) if(row[h][w] != '?') { row[h][w] = '?'; if(!waiting_col[w]) { waiting_col[w] = true; que.push_back(w + 1); } } } inline void scan_col(int w) { char color = '?'; for(int h = 0; h < height; ++h) { if(color == '?') color = row[h][w]; else if(row[h][w] != '?' && color != row[h][w]) return; } if(color == '?') return; action.push_back({w + 1, color}); for(int h = 0; h < height; ++h) if(row[h][w] != '?') { row[h][w] = '?'; if(!waiting_row[h]) { waiting_row[h] = true; que.push_back(-h - 1); } } } inline int abs(int a) { return a < 0 ? -a : a; } |
English