#include <bits/stdc++.h> using namespace std; using ll = long long; using pii = pair <int, int>; using pll = pair <ll, ll>; const int inf = 1e9+7; const ll inf_ll = 1e18+7; void boost () { ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0); } struct Rzad { char kierunek; int nr; int znak; }; int h, w, tab[2007][2007]; string s; int wiersze[2007][30], kolumny[2007][30]; bool czy_wiersz[2007], czy_kolumna[2007]; queue<Rzad> q; vector<Rzad> v; int main () { boost(); cin >> h >> w; for (int y = 1; y <= h; y++) { cin >> s; for (int x = 1; x <= w; x++) { int znak = s[x - 1] - 'A'; tab[x][y] = znak; wiersze[y][znak]++; kolumny[x][znak]++; if (wiersze[y][znak] == w) { q.push({'R', y, znak}); czy_wiersz[y] = true; } if (kolumny[x][znak] == h) { q.push({'K', x, znak}); czy_kolumna[x] = true; } } } while (!q.empty()) { Rzad rzad = q.front(); q.pop(); v.push_back(rzad); if (rzad.kierunek == 'R') { for (int x = 1; x <= w; x++) { for (int znak = 0; znak < 26; znak++) { if (znak != rzad.znak) kolumny[x][znak]++; if (kolumny[x][znak] == h && !czy_kolumna[x]) { q.push({'K', x, znak}); czy_kolumna[x] = true; } } } } else { for (int y = 1; y <= h; y++) { for (int znak = 0; znak < 26; znak++) { if (znak != rzad.znak) wiersze[y][znak]++; if (wiersze[y][znak] == w && !czy_wiersz[y]) { q.push({'R', y, znak}); czy_wiersz[y] = true; } } } } } reverse(v.begin(), v.end()); cout << v.size() << "\n"; for (Rzad rzad: v) { cout << rzad.kierunek << " " << rzad.nr << " " << (char)('A' + rzad.znak) << "\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 | #include <bits/stdc++.h> using namespace std; using ll = long long; using pii = pair <int, int>; using pll = pair <ll, ll>; const int inf = 1e9+7; const ll inf_ll = 1e18+7; void boost () { ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0); } struct Rzad { char kierunek; int nr; int znak; }; int h, w, tab[2007][2007]; string s; int wiersze[2007][30], kolumny[2007][30]; bool czy_wiersz[2007], czy_kolumna[2007]; queue<Rzad> q; vector<Rzad> v; int main () { boost(); cin >> h >> w; for (int y = 1; y <= h; y++) { cin >> s; for (int x = 1; x <= w; x++) { int znak = s[x - 1] - 'A'; tab[x][y] = znak; wiersze[y][znak]++; kolumny[x][znak]++; if (wiersze[y][znak] == w) { q.push({'R', y, znak}); czy_wiersz[y] = true; } if (kolumny[x][znak] == h) { q.push({'K', x, znak}); czy_kolumna[x] = true; } } } while (!q.empty()) { Rzad rzad = q.front(); q.pop(); v.push_back(rzad); if (rzad.kierunek == 'R') { for (int x = 1; x <= w; x++) { for (int znak = 0; znak < 26; znak++) { if (znak != rzad.znak) kolumny[x][znak]++; if (kolumny[x][znak] == h && !czy_kolumna[x]) { q.push({'K', x, znak}); czy_kolumna[x] = true; } } } } else { for (int y = 1; y <= h; y++) { for (int znak = 0; znak < 26; znak++) { if (znak != rzad.znak) wiersze[y][znak]++; if (wiersze[y][znak] == w && !czy_wiersz[y]) { q.push({'R', y, znak}); czy_wiersz[y] = true; } } } } } reverse(v.begin(), v.end()); cout << v.size() << "\n"; for (Rzad rzad: v) { cout << rzad.kierunek << " " << rzad.nr << " " << (char)('A' + rzad.znak) << "\n"; } return 0; } |