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
#include <iostream>

void gora_dol(char plansza[][500], int n, int m, int pocz_wartosc_iteratora, int roznica) { 
    int kolumna; // kolumna na której aktualnie dzieje się operacja
    int przod; // przód gąsiennicy oczywiście, szuka kolejnych niepustych kratek
    int tyl; // tył gąsiennicy, pamięta ostatnią pełną kratkę :3

    for (kolumna = 0; kolumna < m; kolumna ++) {
        przod = pocz_wartosc_iteratora;
        if (przod > 0) tyl = przod + 1;
        else tyl = przod - 1;
        while ((przod < n) && (przod >= 0)) {
            if (plansza[przod][kolumna] != '.') {
                tyl += roznica; // to będzie nowa ostatnia pełna kratka
                if (tyl != przod)  {
                    // std::cout << "Przesuwam " << plansza[przod][kolumna] << " z miejsca (" << przod << ", " << kolumna << ") na miejsce (" << tyl << ", " << kolumna << ")\n";
                    plansza[tyl][kolumna] = plansza[przod][kolumna];
                    plansza[przod][kolumna] = '.';
                }
            }
            przod += roznica;
        }
    }
}

void prawo_lewo(char plansza[][500], int n, int m, int pocz_wartosc_iteratora, int roznica) {
    int wiersz, przod, tyl;

    for (wiersz = 0; wiersz < n; wiersz ++) {
        przod = pocz_wartosc_iteratora;
        if (przod > 0) tyl = przod + 1;
        else tyl = przod - 1;
        while ((przod < m) && (przod >= 0)) {
            if (plansza[wiersz][przod] != '.') {
                tyl += roznica;
                if (tyl != przod) {
                    // std::cout << "Przesuwam " << plansza[wiersz][przod] << " z miejsca (" << wiersz << ", " << przod << ") na miejsce (" << wiersz << ", " << tyl << ")\n";
                    plansza[wiersz][tyl] = plansza[wiersz][przod];
                    plansza[wiersz][przod] = '.';
                }
            }
            przod += roznica;
        }
    }
}

int main() {
    std::ios_base::sync_with_stdio(false);
    std::cin.tie(NULL);

    int n, m, k; // wysokość n i szerokość m 
    char plansza[500][500]; // n x m (indeks wysokości, indeks szerokości numeracja w dół i w prawo)
    std::cin >> n >> m;

    for (int i = 0; i < n; i ++) {
        for (int j = 0; j < m; j ++) {
            std::cin >> plansza[i][j];
        }
    }

    std::cin >> k;
    char pom, pop;
    pop = 'N'; // N jak NIC

    for (int i = 0; i < k; i ++) {
        std::cin >> pom;
        if (pom == pop) { // nie ma sensu robić dwóch takich samych operacji pod rząd, czy coś jeszcze?
            // NICCCCCCCC
        }
        else if (pom == 'G') {
            gora_dol(plansza, n, m, 0, 1);
        }
        else if (pom == 'D') {
            gora_dol(plansza, n, m, n - 1, -1);
        }
        else if (pom == 'L') {
            prawo_lewo(plansza, n, m, 0, 1);
        }
        else { // pom == 'P'
            prawo_lewo(plansza, n, m, m - 1, -1);
        }
        pop = pom; // bo zaraz będzie wcztywane nowe
    }

    for (int i = 0; i < n; i ++) {
        for (int j = 0; j < m; j ++) {
            std::cout << plansza[i][j];
        }
        std::cout << "\n";
    }

    return 0;
}