#include <bits/stdc++.h> using namespace std; int n, m; vector<string> v; int dim1(bool transpose) { return transpose ? n : m; } int dim2(bool transpose) { return transpose ? m : n; } char& get(int w, int k, bool transpose = 0) { if(!(transpose ? (0<=w&&w<n&&0<=k&&k<=m) : (0<=w&&w<m&&0<=k&&k<=n))) throw w*100000+k; return transpose ? v[w][k] : v[k][w]; } void gravity(bool transpose, bool nakoniec) { string t; for(int i = 0; i < dim1(transpose); ++i) { t.clear(); for(int j = 0; j < dim2(transpose); ++j) { char tt = get(i, j, transpose); if(tt != '.') t += tt; } int l = nakoniec ? dim2(transpose) - t.size() : 0; int r = nakoniec ? dim2(transpose) : t.size(); for(int k = 0; k < l; ++k) get(i, k, transpose) = '.'; for(int k = 0; k < t.size(); ++k) get(i, l+k, transpose) = t[k]; for(int k = r; k < dim2(transpose); ++k) get(i, k, transpose) = '.'; } } void ruch(char c) { // c=0 nic nie robi switch(c) { case 'L': gravity(1, 0); break; case 'G': gravity(0, 0); break; case 'D': gravity(0, 1); break; case 'P': gravity(1, 1); break; } } void wypisz() { for(auto &&e : v) cout << e << '\n'; } char odwroc(char c) { switch(c) { case 'L': return 'P'; break; case 'G': return 'D'; break; case 'D': return 'G'; break; case 'P': return 'L'; break; } return 0; } string uprosc(string s, int offset) { string n; char pion = 0, poziom = 0; for(int i = offset; i < s.size(); ++i) { if(n.size() && s[i] == n.back()) continue; if(n.size() && s[i] == odwroc(n.back())) { n.pop_back(); if(n.size()>=2) { char cc = n[n.size()-2]; switch(cc) { case 'L': case 'P': poziom = cc; break; case 'D': case 'G': pion = cc; break; } continue; } else if(n.size() == 1) { switch(n[0]) { case 'L': case 'P': pion = 0; break; case 'D': case 'G': poziom = 0; break; } } else pion = poziom = 0; } char c = s[i]; bool b = true; switch(c) { case 'L': case 'P': if(c==poziom) b = false; poziom = c; break; case 'D': case 'G': if(c==pion) b = false; pion = c; break; } if(b) n.push_back(s[i]); } return n; } int main() { cin >> n >> m; v.resize(n); for(auto &&e : v) cin >> e; int k; cin >> k; string s; cin >> s; char pion = 0, poziom = 0; bool poziom_pierwszy; int i; for(i = 0; i < s.size(); ++i) { if(pion && poziom) break; char c = s[i]; switch(c) { case 'L': case 'P': poziom = c; if(!pion) poziom_pierwszy = true; break; case 'D': case 'G': pion = c; if(!poziom) poziom_pierwszy = false; break; } } if(poziom_pierwszy) { ruch(poziom); ruch(pion); } else { ruch(pion); ruch(poziom); } s = uprosc(s, i); for(auto &&e : s) ruch(e); wypisz(); }
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 | #include <bits/stdc++.h> using namespace std; int n, m; vector<string> v; int dim1(bool transpose) { return transpose ? n : m; } int dim2(bool transpose) { return transpose ? m : n; } char& get(int w, int k, bool transpose = 0) { if(!(transpose ? (0<=w&&w<n&&0<=k&&k<=m) : (0<=w&&w<m&&0<=k&&k<=n))) throw w*100000+k; return transpose ? v[w][k] : v[k][w]; } void gravity(bool transpose, bool nakoniec) { string t; for(int i = 0; i < dim1(transpose); ++i) { t.clear(); for(int j = 0; j < dim2(transpose); ++j) { char tt = get(i, j, transpose); if(tt != '.') t += tt; } int l = nakoniec ? dim2(transpose) - t.size() : 0; int r = nakoniec ? dim2(transpose) : t.size(); for(int k = 0; k < l; ++k) get(i, k, transpose) = '.'; for(int k = 0; k < t.size(); ++k) get(i, l+k, transpose) = t[k]; for(int k = r; k < dim2(transpose); ++k) get(i, k, transpose) = '.'; } } void ruch(char c) { // c=0 nic nie robi switch(c) { case 'L': gravity(1, 0); break; case 'G': gravity(0, 0); break; case 'D': gravity(0, 1); break; case 'P': gravity(1, 1); break; } } void wypisz() { for(auto &&e : v) cout << e << '\n'; } char odwroc(char c) { switch(c) { case 'L': return 'P'; break; case 'G': return 'D'; break; case 'D': return 'G'; break; case 'P': return 'L'; break; } return 0; } string uprosc(string s, int offset) { string n; char pion = 0, poziom = 0; for(int i = offset; i < s.size(); ++i) { if(n.size() && s[i] == n.back()) continue; if(n.size() && s[i] == odwroc(n.back())) { n.pop_back(); if(n.size()>=2) { char cc = n[n.size()-2]; switch(cc) { case 'L': case 'P': poziom = cc; break; case 'D': case 'G': pion = cc; break; } continue; } else if(n.size() == 1) { switch(n[0]) { case 'L': case 'P': pion = 0; break; case 'D': case 'G': poziom = 0; break; } } else pion = poziom = 0; } char c = s[i]; bool b = true; switch(c) { case 'L': case 'P': if(c==poziom) b = false; poziom = c; break; case 'D': case 'G': if(c==pion) b = false; pion = c; break; } if(b) n.push_back(s[i]); } return n; } int main() { cin >> n >> m; v.resize(n); for(auto &&e : v) cin >> e; int k; cin >> k; string s; cin >> s; char pion = 0, poziom = 0; bool poziom_pierwszy; int i; for(i = 0; i < s.size(); ++i) { if(pion && poziom) break; char c = s[i]; switch(c) { case 'L': case 'P': poziom = c; if(!pion) poziom_pierwszy = true; break; case 'D': case 'G': pion = c; if(!poziom) poziom_pierwszy = false; break; } } if(poziom_pierwszy) { ruch(poziom); ruch(pion); } else { ruch(pion); ruch(poziom); } s = uprosc(s, i); for(auto &&e : s) ruch(e); wypisz(); } |