Advertisement
Derga

Untitled

Jun 1st, 2024
15
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.88 KB | None | 0 0
  1. #include <algorithm>
  2. #include <iostream>
  3. #include <vector>
  4. #include <queue>
  5.  
  6. using namespace std;
  7.  
  8. const char UP = 'N';
  9. const char DOWN = 'S';
  10. const char LEFT = 'W';
  11. const char RIGHT = 'E';
  12.  
  13. const int UP_IDX = 0;
  14. const int RIGHT_IDX = 1;
  15. const int DOWN_IDX = 2;
  16. const int LEFT_IDX = 3;
  17.  
  18. const int SIDE_SIZE = 20;
  19. const int INF = SIDE_SIZE * SIDE_SIZE + 1;
  20. const int START_I = SIDE_SIZE / 2;
  21. const int START_J = SIDE_SIZE / 2;
  22.  
  23. struct Point {
  24. int i;
  25. int j;
  26. };
  27.  
  28. struct DistAndMoves {
  29. DistAndMoves() : possible_moves(4, false), dist(INF) {}
  30. DistAndMoves(int dist) : possible_moves(4, false), dist(dist) {}
  31.  
  32. vector<bool> possible_moves;
  33. int dist;
  34. };
  35.  
  36. struct PointDist {
  37. int i;
  38. int j;
  39. int dist;
  40. };
  41.  
  42. void Bfs(const vector<vector<bool>>& is_available, vector<vector<DistAndMoves>>& turns) {
  43. turns[START_I][START_J].dist = 0;
  44.  
  45. queue<PointDist> q;
  46. q.push({ START_I, START_J, 0 });
  47. while (!q.empty()) {
  48. auto [i, j, dist] = q.front();
  49. q.pop();
  50.  
  51. for (int di = -1; di <= 1; ++di) {
  52. for (int dj = -1; dj <= 1; ++dj) {
  53. if (di * di + dj * dj != 1) continue;
  54.  
  55. int ni = i + di;
  56. int nj = j + dj;
  57. if (ni < 0 || is_available.size() <= ni ||
  58. nj < 0 || is_available.front().size() <= nj) {
  59. continue;
  60. }
  61. if (!is_available[ni][nj]) continue;
  62. if (turns[ni][nj].dist < dist) continue;
  63. if (turns[ni][nj].dist == INF) {
  64. if (di == -1) {
  65. turns[ni][nj].possible_moves[UP_IDX] = true;
  66. } else if (di == 1) {
  67. turns[ni][nj].possible_moves[DOWN_IDX] = true;
  68. } else if (dj == -1) {
  69. turns[ni][nj].possible_moves[LEFT_IDX] = true;
  70. } else if (dj == 1) {
  71. turns[ni][nj].possible_moves[RIGHT_IDX] = true;
  72. }
  73. turns[ni][nj].dist = dist + 1;
  74. q.push({ ni, nj, turns[ni][nj].dist });
  75. continue;
  76. }
  77.  
  78. if (turns[ni][nj].dist == dist + 1) {
  79. if (di == -1) {
  80. turns[ni][nj].possible_moves[UP_IDX] = true;
  81. }
  82. else if (di == 1) {
  83. turns[ni][nj].possible_moves[DOWN_IDX] = true;
  84. }
  85. else if (dj == -1) {
  86. turns[ni][nj].possible_moves[LEFT_IDX] = true;
  87. }
  88. else if (dj == 1) {
  89. turns[ni][nj].possible_moves[RIGHT_IDX] = true;
  90. }
  91. }
  92. }
  93. }
  94. }
  95. }
  96.  
  97. int main() {
  98. ios::sync_with_stdio(0);
  99. cin.tie(0);
  100. cout.tie(0);
  101.  
  102. vector<vector<bool>>is_available(SIDE_SIZE, vector<bool>(SIDE_SIZE, false));
  103. string path;
  104. cin >> path;
  105. is_available[START_I][START_J] = true;
  106. int i = START_I;
  107. int j = START_J;
  108. for (auto move : path) {
  109. if (move == RIGHT) {
  110. j += 1;
  111. }
  112. else if (move == LEFT) {
  113. j -= 1;
  114. }
  115. else if (move == UP) {
  116. i += 1;
  117. }
  118. else if (move == DOWN) {
  119. i -= 1;
  120. }
  121. is_available[i][j] = true;
  122. }
  123.  
  124. for (int i = 0; i < SIDE_SIZE; ++i) {
  125. for (int j = 0; j < SIDE_SIZE; ++j) {
  126. if (i == START_I && j == START_J) {
  127. cout << 'S'; continue;
  128. }
  129. if (is_available[i][j]) {
  130. cout << 1;
  131. } else {
  132. cout << 0;
  133. }
  134. }
  135. cout << '\n';
  136. }
  137.  
  138.  
  139. DistAndMoves dam;
  140. vector<vector<DistAndMoves>> dist_and_moves(is_available.size(),
  141. vector<DistAndMoves>(is_available.size(), dam));
  142.  
  143. Bfs(is_available, dist_and_moves);
  144. string shortest_way_out;
  145.  
  146. /*
  147. moves priority
  148. N, E, S, W
  149.  
  150. const char UP = 'N';
  151. const char DOWN = 'S';
  152. const char LEFT = 'W';
  153. const char RIGHT = 'E';
  154. */
  155. while (!(i == START_I && j == START_J)) {
  156. if (dist_and_moves[i][j].possible_moves[DOWN_IDX]) {
  157. ++i;
  158. shortest_way_out += UP;
  159. } else if (dist_and_moves[i][j].possible_moves[UP_IDX]) {
  160. --i;
  161. shortest_way_out += DOWN;
  162. } else if (dist_and_moves[i][j].possible_moves[RIGHT_IDX]) {
  163. --j;
  164. shortest_way_out += LEFT;
  165. } else /*if (dist_and_moves[i][j].possible_moves[LEFT_IDX])*/ {
  166. ++j;
  167. shortest_way_out += RIGHT;
  168. }
  169. }
  170.  
  171. reverse(begin(shortest_way_out), end(shortest_way_out));
  172. cout << shortest_way_out;
  173.  
  174. return 0;
  175. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement