#include<bits/stdc++.h> using namespace std; #define MAX_SIZE 507 #define X first #define Y second int rows, cols; int total_moves; char fence = '@'; char blank = '.'; char board[MAX_SIZE][MAX_SIZE]; map<char, pair<int, int>> move_vectors = { { 'G', { 0, 1} }, { 'D', { 0, -1} }, { 'L', {-1, 0} }, { 'P', { 1, 0} }, }; template <typename T,typename U> pair<T,U> operator+(const pair<T,U> &l, const pair<T,U> &r) { return make_pair(l.first + r.first, l.second + r.second); } void print_board() { for (int row = rows; row > 0; row--) { for (int col = 1; col <= cols; col++) { cout << board[col][row]; } cout << "\n"; } } char get_board(pair<int, int> coord) { return board[coord.X][coord.Y]; } void swap_board(pair<int, int> coord_1, pair<int, int> coord_2) { swap(board[coord_1.X][coord_1.Y], board[coord_2.X][coord_2.Y]); } void apply_move_one_block(pair<int, int> current_coord, pair<int, int> single_move) { auto next_coord = current_coord + single_move; while (get_board(next_coord) == blank) { swap_board(current_coord, next_coord); current_coord = next_coord; next_coord = next_coord + single_move; } } void apply_move(char next_move) { if (next_move == 'G') { for (int row = rows; row > 0; row--) { for (int col = 1; col <= cols; col++) { apply_move_one_block(make_pair(col, row), move_vectors[next_move]); } } return; } if (next_move == 'D') { for (int row = 1; row <= rows; row++) { for (int col = 1; col <= cols; col++) { apply_move_one_block(make_pair(col, row), move_vectors[next_move]); } } return; } if (next_move == 'L') { for (int col = 1; col <= cols; col++) { for (int row = 1; row <= rows; row++) { apply_move_one_block(make_pair(col, row), move_vectors[next_move]); } } return; } if (next_move == 'P') { for (int col = cols; col > 0; col--) { for (int row = 1; row <= rows; row++) { apply_move_one_block(make_pair(col, row), move_vectors[next_move]); } } return; } } int main() { ios_base::sync_with_stdio(false); cin >> rows >> cols; for (int i = 0; i <= rows + 1; i++) { board[0][i] = fence; board[cols + 1][i] = fence; } for (int i = 0; i <= cols + 1; i++) { board[i][0] = fence; board[i][rows + 1] = fence; } for (int row = rows; row > 0; row--) { for (int col = 1; col <= cols; col++) { cin >> board[col][row]; } } cin >> total_moves; for (int move_cnt = 1; move_cnt <= total_moves; move_cnt++) { char next_move; cin >> next_move; apply_move(next_move); } print_board(); 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 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 | #include<bits/stdc++.h> using namespace std; #define MAX_SIZE 507 #define X first #define Y second int rows, cols; int total_moves; char fence = '@'; char blank = '.'; char board[MAX_SIZE][MAX_SIZE]; map<char, pair<int, int>> move_vectors = { { 'G', { 0, 1} }, { 'D', { 0, -1} }, { 'L', {-1, 0} }, { 'P', { 1, 0} }, }; template <typename T,typename U> pair<T,U> operator+(const pair<T,U> &l, const pair<T,U> &r) { return make_pair(l.first + r.first, l.second + r.second); } void print_board() { for (int row = rows; row > 0; row--) { for (int col = 1; col <= cols; col++) { cout << board[col][row]; } cout << "\n"; } } char get_board(pair<int, int> coord) { return board[coord.X][coord.Y]; } void swap_board(pair<int, int> coord_1, pair<int, int> coord_2) { swap(board[coord_1.X][coord_1.Y], board[coord_2.X][coord_2.Y]); } void apply_move_one_block(pair<int, int> current_coord, pair<int, int> single_move) { auto next_coord = current_coord + single_move; while (get_board(next_coord) == blank) { swap_board(current_coord, next_coord); current_coord = next_coord; next_coord = next_coord + single_move; } } void apply_move(char next_move) { if (next_move == 'G') { for (int row = rows; row > 0; row--) { for (int col = 1; col <= cols; col++) { apply_move_one_block(make_pair(col, row), move_vectors[next_move]); } } return; } if (next_move == 'D') { for (int row = 1; row <= rows; row++) { for (int col = 1; col <= cols; col++) { apply_move_one_block(make_pair(col, row), move_vectors[next_move]); } } return; } if (next_move == 'L') { for (int col = 1; col <= cols; col++) { for (int row = 1; row <= rows; row++) { apply_move_one_block(make_pair(col, row), move_vectors[next_move]); } } return; } if (next_move == 'P') { for (int col = cols; col > 0; col--) { for (int row = 1; row <= rows; row++) { apply_move_one_block(make_pair(col, row), move_vectors[next_move]); } } return; } } int main() { ios_base::sync_with_stdio(false); cin >> rows >> cols; for (int i = 0; i <= rows + 1; i++) { board[0][i] = fence; board[cols + 1][i] = fence; } for (int i = 0; i <= cols + 1; i++) { board[i][0] = fence; board[i][rows + 1] = fence; } for (int row = rows; row > 0; row--) { for (int col = 1; col <= cols; col++) { cin >> board[col][row]; } } cin >> total_moves; for (int move_cnt = 1; move_cnt <= total_moves; move_cnt++) { char next_move; cin >> next_move; apply_move(next_move); } print_board(); return 0; } |