#include <algorithm> #include <iostream> #include <vector> using board_t = std::vector< char >; struct Board { int wys; int szer; board_t dt; void tilt(char c); void clockwise(); }; struct Cmp { bool operator() (char const a, char const b) { int left = (a == '.') ? 1 : 0; int rght = (b == '.') ? 1 : 0; return left < rght; } }; void Board::clockwise() { board_t tmp(dt.size(), '?'); for(int i = 0; i < dt.size(); ++i) { int wiersz = i / szer; int kolmna = i % szer; int tr_wiersz = kolmna; int tr_kolmna = wys - wiersz - 1; tmp[tr_wiersz * wys + tr_kolmna] = dt[i]; } std::swap(szer, wys); std::copy(tmp.begin(), tmp.end(), dt.begin()); } void Board::tilt(char kier) { if(kier == 'L') { for(int i = 0; i < wys; ++i) { auto it = dt.begin() + i * szer; std::stable_sort(it, it + szer, Cmp{}); } } else if(kier == 'P') { for(int i = 0; i < wys; ++i) { auto it = dt.rbegin() + i * szer; std::stable_sort(it, it + szer, Cmp{}); } } else { clockwise(); if(kier == 'D') { tilt('L'); } else if(kier == 'G') { tilt('P'); } clockwise(); clockwise(); clockwise(); } } int main() { Board brd; std::cin >> brd.wys >> brd.szer; brd.dt.resize(brd.szer * brd.wys); for(int i = 0; i < brd.wys; ++i) { for(int k = 0; k < brd.szer; ++k) { std::cin >> brd.dt[i * brd.szer + k]; } } int moves; std::cin >> moves; for (int i = 0; i < moves; ++i) { char kier; std::cin >> kier; brd.tilt(kier); } for(int i = 0; i < brd.wys; ++i) { for(int k = 0; k < brd.szer; ++k) { std::cout << brd.dt[i * brd.szer + k]; } std::cout << "\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 81 82 83 84 85 86 87 88 89 90 91 92 | #include <algorithm> #include <iostream> #include <vector> using board_t = std::vector< char >; struct Board { int wys; int szer; board_t dt; void tilt(char c); void clockwise(); }; struct Cmp { bool operator() (char const a, char const b) { int left = (a == '.') ? 1 : 0; int rght = (b == '.') ? 1 : 0; return left < rght; } }; void Board::clockwise() { board_t tmp(dt.size(), '?'); for(int i = 0; i < dt.size(); ++i) { int wiersz = i / szer; int kolmna = i % szer; int tr_wiersz = kolmna; int tr_kolmna = wys - wiersz - 1; tmp[tr_wiersz * wys + tr_kolmna] = dt[i]; } std::swap(szer, wys); std::copy(tmp.begin(), tmp.end(), dt.begin()); } void Board::tilt(char kier) { if(kier == 'L') { for(int i = 0; i < wys; ++i) { auto it = dt.begin() + i * szer; std::stable_sort(it, it + szer, Cmp{}); } } else if(kier == 'P') { for(int i = 0; i < wys; ++i) { auto it = dt.rbegin() + i * szer; std::stable_sort(it, it + szer, Cmp{}); } } else { clockwise(); if(kier == 'D') { tilt('L'); } else if(kier == 'G') { tilt('P'); } clockwise(); clockwise(); clockwise(); } } int main() { Board brd; std::cin >> brd.wys >> brd.szer; brd.dt.resize(brd.szer * brd.wys); for(int i = 0; i < brd.wys; ++i) { for(int k = 0; k < brd.szer; ++k) { std::cin >> brd.dt[i * brd.szer + k]; } } int moves; std::cin >> moves; for (int i = 0; i < moves; ++i) { char kier; std::cin >> kier; brd.tilt(kier); } for(int i = 0; i < brd.wys; ++i) { for(int k = 0; k < brd.szer; ++k) { std::cout << brd.dt[i * brd.szer + k]; } std::cout << "\n"; } } |