#include <bits/stdc++.h> using namespace std; const int MX=500100; int n,w,m,q,i,j,cnt,a[505][505],sva[505][505],p[MX],ans[MX]; char s[505][505],c[MX],ch[MX]; bool u[MX]; void performG() { for (int j=0; j<w; j++) for (int i=0, lst=0; i<n; i++) { if (a[i][j]) a[lst++][j]=a[i][j]; if (lst<=i) a[i][j]=0; } } void performD() { for (int j=0; j<w; j++) for (int i=n-1, lst=n-1; i>=0; i--) { if (a[i][j]) a[lst--][j]=a[i][j]; if (lst>=i) a[i][j]=0; } } void performL() { for (int i=0; i<n; i++) for (int j=0, lst=0; j<w; j++) { if (a[i][j]) a[i][lst++]=a[i][j]; if (lst<=j) a[i][j]=0; } } void performP() { for (int i=0; i<n; i++) for (int j=w-1, lst=w-1; j>=0; j--) { if (a[i][j]) a[i][lst--]=a[i][j]; if (lst>=j) a[i][j]=0; } } int main() { scanf("%d%d",&n,&w); for (i=0; i<n; i++) { scanf("%s",s[i]); for (j=0; j<w; j++) if (s[i][j]!='.') { a[i][j]=++cnt; ch[cnt]=s[i][j]; } } scanf("%d",&q); scanf("%s",c); for (m=0, i=1; i<q; i++) if (c[i]!=c[m]) { c[++m]=c[i]; while (m>0) { if (c[m]=='L') { if (c[m-1]=='P') c[--m]='L'; } else if (c[m]=='P') { if (c[m-1]=='L') c[--m]='P'; } else if (c[m]=='G') { if (c[m-1]=='D') c[--m]='G'; } else if (c[m]=='D') { if (c[m-1]=='G') c[--m]='D'; } if (m>0 && c[m-2]==c[m]) --m; else break; } //for (int j=0; j<=m; j++) putchar(c[j]); //putchar('\n'); } //c[m+1]=0; //puts(c); for (i=0; i<=m && i<=7; i++) { if (c[i]=='G') performG(); if (c[i]=='D') performD(); if (c[i]=='L') performL(); if (c[i]=='P') performP(); { //for (int i=0; i<n; i++,puts("")) for (int j=0; j<w; j++) if (a[i][j]==0) putchar(' '); else printf("%d",a[i][j]); //puts(""); } if (i==3) for (int i=0; i<n; i++) for (int j=0; j<w; j++) sva[i][j]=a[i][j]; if (i==7) for (int i=0; i<n; i++) for (int j=0; j<w; j++) if (a[i][j]) p[sva[i][j]]=a[i][j]; } //if needed : perm * (m+1)/4 - ?; + //rest //if (i>m) print if (i<=m) { int tot=(m-3)/4; if (tot>1) { for (i=1; i<=cnt; i++) if (!u[i]) { vector<int> cp; for (j=i; !u[j]; j=p[j]) { cp.push_back(j); u[j]=true; } for (j=0; j<cp.size(); j++) ans[cp[j]]=cp[(j+tot)%int(cp.size())]; } for (int i=0; i<n; i++) for (int j=0; j<w; j++) if (a[i][j]) a[i][j]=ans[sva[i][j]]; } for (i=m; i%4!=3; i--); for (++i; i<=m; ++i) { if (c[i]=='G') performG(); if (c[i]=='D') performD(); if (c[i]=='L') performL(); if (c[i]=='P') performP(); } } for (i=0; i<n; i++,puts("")) for (j=0; j<w; j++) if (a[i][j]==0) putchar('.'); else putchar(ch[a[i][j]]); 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 92 93 94 95 96 97 98 | #include <bits/stdc++.h> using namespace std; const int MX=500100; int n,w,m,q,i,j,cnt,a[505][505],sva[505][505],p[MX],ans[MX]; char s[505][505],c[MX],ch[MX]; bool u[MX]; void performG() { for (int j=0; j<w; j++) for (int i=0, lst=0; i<n; i++) { if (a[i][j]) a[lst++][j]=a[i][j]; if (lst<=i) a[i][j]=0; } } void performD() { for (int j=0; j<w; j++) for (int i=n-1, lst=n-1; i>=0; i--) { if (a[i][j]) a[lst--][j]=a[i][j]; if (lst>=i) a[i][j]=0; } } void performL() { for (int i=0; i<n; i++) for (int j=0, lst=0; j<w; j++) { if (a[i][j]) a[i][lst++]=a[i][j]; if (lst<=j) a[i][j]=0; } } void performP() { for (int i=0; i<n; i++) for (int j=w-1, lst=w-1; j>=0; j--) { if (a[i][j]) a[i][lst--]=a[i][j]; if (lst>=j) a[i][j]=0; } } int main() { scanf("%d%d",&n,&w); for (i=0; i<n; i++) { scanf("%s",s[i]); for (j=0; j<w; j++) if (s[i][j]!='.') { a[i][j]=++cnt; ch[cnt]=s[i][j]; } } scanf("%d",&q); scanf("%s",c); for (m=0, i=1; i<q; i++) if (c[i]!=c[m]) { c[++m]=c[i]; while (m>0) { if (c[m]=='L') { if (c[m-1]=='P') c[--m]='L'; } else if (c[m]=='P') { if (c[m-1]=='L') c[--m]='P'; } else if (c[m]=='G') { if (c[m-1]=='D') c[--m]='G'; } else if (c[m]=='D') { if (c[m-1]=='G') c[--m]='D'; } if (m>0 && c[m-2]==c[m]) --m; else break; } //for (int j=0; j<=m; j++) putchar(c[j]); //putchar('\n'); } //c[m+1]=0; //puts(c); for (i=0; i<=m && i<=7; i++) { if (c[i]=='G') performG(); if (c[i]=='D') performD(); if (c[i]=='L') performL(); if (c[i]=='P') performP(); { //for (int i=0; i<n; i++,puts("")) for (int j=0; j<w; j++) if (a[i][j]==0) putchar(' '); else printf("%d",a[i][j]); //puts(""); } if (i==3) for (int i=0; i<n; i++) for (int j=0; j<w; j++) sva[i][j]=a[i][j]; if (i==7) for (int i=0; i<n; i++) for (int j=0; j<w; j++) if (a[i][j]) p[sva[i][j]]=a[i][j]; } //if needed : perm * (m+1)/4 - ?; + //rest //if (i>m) print if (i<=m) { int tot=(m-3)/4; if (tot>1) { for (i=1; i<=cnt; i++) if (!u[i]) { vector<int> cp; for (j=i; !u[j]; j=p[j]) { cp.push_back(j); u[j]=true; } for (j=0; j<cp.size(); j++) ans[cp[j]]=cp[(j+tot)%int(cp.size())]; } for (int i=0; i<n; i++) for (int j=0; j<w; j++) if (a[i][j]) a[i][j]=ans[sva[i][j]]; } for (i=m; i%4!=3; i--); for (++i; i<=m; ++i) { if (c[i]=='G') performG(); if (c[i]=='D') performD(); if (c[i]=='L') performL(); if (c[i]=='P') performP(); } } for (i=0; i<n; i++,puts("")) for (j=0; j<w; j++) if (a[i][j]==0) putchar('.'); else putchar(ch[a[i][j]]); return 0; } |