#include <bits/stdc++.h> using namespace std; #define f first #define s second vector<vector<char>> graph; vector<pair<int, int>> tiles; map<char, pair<int, int>> directions{{'G', {-1, 0}}, {'D', {1, 0}}, {'L', {0, -1}}, {'P', {0, 1}}}; void Input(); void makeMoves(char dir); void makeMove(int tile_nb, char dir); bool canMakeMove(int i, int j, char dir); void printSolution(); int main() { cin.tie(0); ios::sync_with_stdio(0); Input(); int moves_nb; cin >> moves_nb; while (moves_nb--) { char dir; cin >> dir; makeMoves(dir); } printSolution(); return 0; } void Input() { int rows, columns; cin >> rows >> columns; graph = vector<vector<char>>(rows, vector<char>(columns)); int nb_tiles = 0; for (int i = 0; i < rows; i++) { for (int j = 0; j < columns; j++) { cin >> graph[i][j]; if (graph[i][j] != '.') { nb_tiles++; } } } int iter = 0; tiles = vector<pair<int, int>>(nb_tiles); for (int i = 0; i < rows && iter < nb_tiles; i++) { for (int j = 0; j < columns && iter < nb_tiles; j++) { if (graph[i][j] != '.') { tiles[iter++] = {i, j}; } } } } void makeMoves(char dir) { sort(tiles.begin(), tiles.end()); if (dir == 'L' || dir == 'G') { for (int i = 0; i < tiles.size(); i++) { makeMove(i, dir); } } else { for (int i = tiles.size() - 1; i >= 0; i--) { makeMove(i, dir); } } } void makeMove(int tile_nb, char dir) { int i = tiles[tile_nb].f; int j = tiles[tile_nb].s; int new_i = -1; int new_j = -1; int tmp_i = i; int tmp_j = j; while (canMakeMove(tmp_i, tmp_j, dir)) { new_i = tmp_i + directions[dir].f; new_j = tmp_j + directions[dir].s; tmp_i = new_i; tmp_j = new_j; } if (new_i != -1) { swap(graph[i][j], graph[new_i][new_j]); tiles[tile_nb] = {new_i, new_j}; } } bool canMakeMove(int i, int j, char dir) { int new_i = i + directions[dir].f; int new_j = j + directions[dir].s; if (new_i >= 0 && new_i < graph.size() && new_j >= 0 && new_j < graph[new_i].size() && graph[new_i][new_j] == '.') { return true; } return false; } void printSolution() { for (int i = 0; i < graph.size(); i++) { for (int j = 0; j < graph[i].size(); j++) { cout << graph[i][j]; } cout << endl; } }
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 104 105 | #include <bits/stdc++.h> using namespace std; #define f first #define s second vector<vector<char>> graph; vector<pair<int, int>> tiles; map<char, pair<int, int>> directions{{'G', {-1, 0}}, {'D', {1, 0}}, {'L', {0, -1}}, {'P', {0, 1}}}; void Input(); void makeMoves(char dir); void makeMove(int tile_nb, char dir); bool canMakeMove(int i, int j, char dir); void printSolution(); int main() { cin.tie(0); ios::sync_with_stdio(0); Input(); int moves_nb; cin >> moves_nb; while (moves_nb--) { char dir; cin >> dir; makeMoves(dir); } printSolution(); return 0; } void Input() { int rows, columns; cin >> rows >> columns; graph = vector<vector<char>>(rows, vector<char>(columns)); int nb_tiles = 0; for (int i = 0; i < rows; i++) { for (int j = 0; j < columns; j++) { cin >> graph[i][j]; if (graph[i][j] != '.') { nb_tiles++; } } } int iter = 0; tiles = vector<pair<int, int>>(nb_tiles); for (int i = 0; i < rows && iter < nb_tiles; i++) { for (int j = 0; j < columns && iter < nb_tiles; j++) { if (graph[i][j] != '.') { tiles[iter++] = {i, j}; } } } } void makeMoves(char dir) { sort(tiles.begin(), tiles.end()); if (dir == 'L' || dir == 'G') { for (int i = 0; i < tiles.size(); i++) { makeMove(i, dir); } } else { for (int i = tiles.size() - 1; i >= 0; i--) { makeMove(i, dir); } } } void makeMove(int tile_nb, char dir) { int i = tiles[tile_nb].f; int j = tiles[tile_nb].s; int new_i = -1; int new_j = -1; int tmp_i = i; int tmp_j = j; while (canMakeMove(tmp_i, tmp_j, dir)) { new_i = tmp_i + directions[dir].f; new_j = tmp_j + directions[dir].s; tmp_i = new_i; tmp_j = new_j; } if (new_i != -1) { swap(graph[i][j], graph[new_i][new_j]); tiles[tile_nb] = {new_i, new_j}; } } bool canMakeMove(int i, int j, char dir) { int new_i = i + directions[dir].f; int new_j = j + directions[dir].s; if (new_i >= 0 && new_i < graph.size() && new_j >= 0 && new_j < graph[new_i].size() && graph[new_i][new_j] == '.') { return true; } return false; } void printSolution() { for (int i = 0; i < graph.size(); i++) { for (int j = 0; j < graph[i].size(); j++) { cout << graph[i][j]; } cout << endl; } } |