Advertisement
Derga

Untitled

May 27th, 2024
15
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.74 KB | None | 0 0
  1. 459
  2.  
  3. #include <algorithm>
  4. #include <iostream>
  5. #include <vector>
  6. #include <queue>
  7.  
  8. using namespace std;
  9.  
  10. const char UP = 'N';
  11. const char DOWN = 'S';
  12. const char LEFT = 'W';
  13. const char RIGHT = 'E';
  14.  
  15. struct Point {
  16. int i;
  17. int j;
  18. };
  19.  
  20. void Bfs(const vector<vector<bool>>& is_available, vector<vector<char>>& turns) {
  21. queue<Point> q;
  22. q.push({ 250, 250 });
  23. while (!q.empty()) {
  24. auto [i, j] = q.front();
  25. q.pop();
  26.  
  27. for (int di = -1; di <= 1; ++di) {
  28. for (int dj = -1; dj <= 1; ++dj) {
  29. if (di * di + dj * dj != 1) continue;
  30.  
  31. int ni = i + di;
  32. int nj = j + dj;
  33. if (ni < 0 || is_available.size() <= ni ||
  34. nj < 0 || is_available.front().size() <= nj) {
  35. continue;
  36. }
  37. if (turns[ni][nj] != '0') continue;
  38.  
  39. if (di == -1) {
  40. turns[ni][nj] = DOWN;
  41. } else if (di == 1) {
  42. turns[ni][nj] = UP;
  43. } else if (dj == -1) {
  44. turns[ni][nj] = LEFT;
  45. } else if (dj == 1) {
  46. turns[ni][nj] = RIGHT;
  47. }
  48.  
  49. q.push({ ni, nj });
  50. }
  51. }
  52. }
  53. }
  54.  
  55. int main() {
  56. ios::sync_with_stdio(0);
  57. cin.tie(0);
  58. cout.tie(0);
  59.  
  60. vector<vector<bool>>is_available(500, vector<bool>(500, false));
  61. string path;
  62. cin >> path;
  63. const int start_i = 250;
  64. const int start_j = 250;
  65. is_available[start_i][start_j] = true;
  66. int i = start_i;
  67. int j = start_j;
  68. for (auto move : path) {
  69. if (move == RIGHT) {
  70. j += 1;
  71. }
  72. else if (move == LEFT) {
  73. j -= 1;
  74. }
  75. else if (move == UP) {
  76. i += 1;
  77. }
  78. else if (move == DOWN) {
  79. i -= 1;
  80. }
  81. is_available[i][j] = true;
  82. }
  83.  
  84. vector<vector<char>> turns(is_available.size(), vector<char>(is_available.size(), '0'));
  85. Bfs(is_available, turns);
  86. string shortest_way_out;
  87. while (!(i == start_i && j == start_j)) {
  88. if (turns[i][j] == UP) {
  89. --i;
  90. shortest_way_out += DOWN;
  91. } else if (turns[i][j] == DOWN) {
  92. ++i;
  93. shortest_way_out += UP;
  94. }
  95. else if (turns[i][j] == LEFT) {
  96. ++j;
  97. shortest_way_out += RIGHT;
  98. } else {
  99. --j;
  100. shortest_way_out += LEFT;
  101. }
  102. }
  103.  
  104. reverse(begin(shortest_way_out), end(shortest_way_out));
  105. cout << shortest_way_out;
  106.  
  107. return 0;
  108. }
  109.  
  110. /*
  111. tets1
  112. EENNESWSSWE
  113.  
  114. NWW
  115.  
  116. test2
  117. SWNNESSWN
  118.  
  119. NES
  120.  
  121. test3
  122. WSEENWWSES
  123.  
  124. NENW
  125. */
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement