#include <iostream> #include <vector> #include <algorithm> #include <numeric> #include <ranges> int ox, oy; int h, w; char field[2001][2001]; enum direction { VERTICAL, HORIZONTAL }; char check_line_monochromatic(int xy, direction dir) { char color = dir == VERTICAL ? field[oy][xy] : field[xy][ox]; /*if(dir == VERTICAL) std::cerr << "V "; else std::cerr << "H "; std::cerr << w << ' ' << h << ' ' << ox << ' ' << oy << '(' << color << " " << xy << ')' << '\n'; for(int y = oy; y < h; ++y) { for(int x = ox; x < w; ++x) std::cout << field[y][x]; std::cout << '\n'; }*/ if(dir == VERTICAL) for(int i = oy+1; i < h; ++i) { if(field[i][xy] != color) return 0; } else for(int i = ox+1; i < w; ++i) { if(field[xy][i] != color) return 0; } return color; } int main() { std::cin >> h >> w; for(int y = 0; y < h; ++y) for(int x = 0; x < w; ++x) std::cin >> field[y][x]; struct line { direction dir; int pos; char color; }; std::vector<line> lines; while((h-oy) && (w-ox)) { if(char c = check_line_monochromatic(ox, VERTICAL); c) { lines.emplace_back(VERTICAL, ox, c); ox += 1; continue; } if(char c = check_line_monochromatic(w - 1, VERTICAL); c) { w -= 1; lines.emplace_back(VERTICAL, w, c); continue; } if(char c = check_line_monochromatic(oy, HORIZONTAL); c) { lines.emplace_back(HORIZONTAL, oy, c); oy += 1; continue; } if(char c = check_line_monochromatic(h-1, HORIZONTAL); c) { h -= 1; lines.emplace_back(HORIZONTAL, h, c); continue; } } std::cout << lines.size() << '\n'; for(auto [dir, pos, color] : lines | std::views::reverse) { if(dir == VERTICAL) std::cout << "K "; else std::cout << "R "; std::cout << pos + 1 << ' ' << color << '\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 | #include <iostream> #include <vector> #include <algorithm> #include <numeric> #include <ranges> int ox, oy; int h, w; char field[2001][2001]; enum direction { VERTICAL, HORIZONTAL }; char check_line_monochromatic(int xy, direction dir) { char color = dir == VERTICAL ? field[oy][xy] : field[xy][ox]; /*if(dir == VERTICAL) std::cerr << "V "; else std::cerr << "H "; std::cerr << w << ' ' << h << ' ' << ox << ' ' << oy << '(' << color << " " << xy << ')' << '\n'; for(int y = oy; y < h; ++y) { for(int x = ox; x < w; ++x) std::cout << field[y][x]; std::cout << '\n'; }*/ if(dir == VERTICAL) for(int i = oy+1; i < h; ++i) { if(field[i][xy] != color) return 0; } else for(int i = ox+1; i < w; ++i) { if(field[xy][i] != color) return 0; } return color; } int main() { std::cin >> h >> w; for(int y = 0; y < h; ++y) for(int x = 0; x < w; ++x) std::cin >> field[y][x]; struct line { direction dir; int pos; char color; }; std::vector<line> lines; while((h-oy) && (w-ox)) { if(char c = check_line_monochromatic(ox, VERTICAL); c) { lines.emplace_back(VERTICAL, ox, c); ox += 1; continue; } if(char c = check_line_monochromatic(w - 1, VERTICAL); c) { w -= 1; lines.emplace_back(VERTICAL, w, c); continue; } if(char c = check_line_monochromatic(oy, HORIZONTAL); c) { lines.emplace_back(HORIZONTAL, oy, c); oy += 1; continue; } if(char c = check_line_monochromatic(h-1, HORIZONTAL); c) { h -= 1; lines.emplace_back(HORIZONTAL, h, c); continue; } } std::cout << lines.size() << '\n'; for(auto [dir, pos, color] : lines | std::views::reverse) { if(dir == VERTICAL) std::cout << "K "; else std::cout << "R "; std::cout << pos + 1 << ' ' << color << '\n'; } } |