fork download
  1. #include <bits/stdc++.h>
  2. #include <thread>
  3. #include <chrono>
  4. using namespace std;
  5.  
  6. const int DR[4] = {-1, 0, 1, 0};
  7. const int DC[4] = {0, 1, 0, -1};
  8.  
  9. void clear_screen() {
  10. cout << "\x1B[2J\x1B[H";
  11. }
  12.  
  13. int main() {
  14. ios::sync_with_stdio(false);
  15. cin.tie(nullptr);
  16.  
  17. int n, m;
  18. if (!(cin >> n >> m)) {
  19. cout << "Input error.\n";
  20. return 0;
  21. }
  22.  
  23. vector<string> maze(n);
  24. for (int i = 0; i < n; i++) {
  25. cin >> maze[i];
  26. if ((int)maze[i].size() != m) {
  27. cout << "Row size error.\n";
  28. return 0;
  29. }
  30. }
  31.  
  32. int sr=-1, sc=-1, er=-1, ec=-1;
  33.  
  34. for (int i=0;i<n;i++){
  35. for (int j=0;j<m;j++){
  36. if (maze[i][j]=='S') { sr=i; sc=j; }
  37. if (maze[i][j]=='E') { er=i; ec=j; }
  38. }
  39. }
  40.  
  41. if (sr==-1 || er==-1) {
  42. cout << "Missing S or E.\n";
  43. return 0;
  44. }
  45.  
  46. vector<vector<char>> visited(n, vector<char>(m, 0));
  47. vector<vector<pair<int,int>>> parent(n, vector<pair<int,int>>(m, {-1,-1}));
  48.  
  49. queue<pair<int,int>> q;
  50. q.push({sr, sc});
  51. visited[sr][sc] = 1;
  52.  
  53. bool found = false;
  54.  
  55. // BFS
  56. while (!q.empty()) {
  57. auto [r, c] = q.front(); q.pop();
  58. if (r == er && c == ec) {
  59. found = true;
  60. break;
  61. }
  62.  
  63. for (int k = 0; k < 4; k++) {
  64. int nr = r + DR[k], nc = c + DC[k];
  65. if (nr < 0 || nr >= n || nc < 0 || nc >= m) continue;
  66. if (visited[nr][nc]) continue;
  67. if (maze[nr][nc] == '#') continue;
  68. visited[nr][nc] = 1;
  69. parent[nr][nc] = {r, c};
  70. q.push({nr, nc});
  71. }
  72. }
  73.  
  74. if (!found) {
  75. cout << "No path.\n";
  76. return 0;
  77. }
  78.  
  79. // reconstruct path
  80. vector<pair<int,int>> path;
  81. int r = er, c = ec;
  82. while (!(r == sr && c == sc)) {
  83. path.push_back({r, c});
  84. tie(r, c) = parent[r][c];
  85. }
  86. path.push_back({sr, sc});
  87. reverse(path.begin(), path.end());
  88.  
  89. // display buffer
  90. vector<string> disp = maze;
  91.  
  92. // first position
  93. disp[sr][sc] = '@';
  94.  
  95. clear_screen();
  96. for (auto &row : disp) cout << row << "\n";
  97. cout << "Step 0: (" << sr << ", " << sc << ")\n";
  98. this_thread::sleep_for(chrono::milliseconds(250));
  99.  
  100. // animate
  101. for (int i = 1; i < (int)path.size(); i++) {
  102. auto [pr, pc] = path[i-1];
  103. auto [nr, nc] = path[i];
  104.  
  105. // restore previous char
  106. if (maze[pr][pc] == 'S') disp[pr][pc] = '.';
  107. else disp[pr][pc] = '.';
  108.  
  109. // move @
  110. disp[nr][nc] = '@';
  111.  
  112. clear_screen();
  113. for (auto &row : disp) cout << row << "\n";
  114. cout << "Step " << i << ": (" << nr << ", " << nc << ")\n";
  115.  
  116. this_thread::sleep_for(chrono::milliseconds(250));
  117. }
  118.  
  119. cout << "Reached exit!\n";
  120. return 0;
  121. }
  122.  
Success #stdin #stdout 0.01s 5316KB
stdin
7 9
#########
#S#.....#
#.#.###.#
#.#...#.#
#.#.#.#.#
#...#..E#
#########
stdout
#########
#@#.....#
#.#.###.#
#.#...#.#
#.#.#.#.#
#...#..E#
#########
Step 0: (1, 1)
#########
#.#.....#
#@#.###.#
#.#...#.#
#.#.#.#.#
#...#..E#
#########
Step 1: (2, 1)
#########
#.#.....#
#.#.###.#
#@#...#.#
#.#.#.#.#
#...#..E#
#########
Step 2: (3, 1)
#########
#.#.....#
#.#.###.#
#.#...#.#
#@#.#.#.#
#...#..E#
#########
Step 3: (4, 1)
#########
#.#.....#
#.#.###.#
#.#...#.#
#.#.#.#.#
#@..#..E#
#########
Step 4: (5, 1)
#########
#.#.....#
#.#.###.#
#.#...#.#
#.#.#.#.#
#.@.#..E#
#########
Step 5: (5, 2)
#########
#.#.....#
#.#.###.#
#.#...#.#
#.#.#.#.#
#..@#..E#
#########
Step 6: (5, 3)
#########
#.#.....#
#.#.###.#
#.#...#.#
#.#@#.#.#
#...#..E#
#########
Step 7: (4, 3)
#########
#.#.....#
#.#.###.#
#.#@..#.#
#.#.#.#.#
#...#..E#
#########
Step 8: (3, 3)
#########
#.#.....#
#.#.###.#
#.#.@.#.#
#.#.#.#.#
#...#..E#
#########
Step 9: (3, 4)
#########
#.#.....#
#.#.###.#
#.#..@#.#
#.#.#.#.#
#...#..E#
#########
Step 10: (3, 5)
#########
#.#.....#
#.#.###.#
#.#...#.#
#.#.#@#.#
#...#..E#
#########
Step 11: (4, 5)
#########
#.#.....#
#.#.###.#
#.#...#.#
#.#.#.#.#
#...#@.E#
#########
Step 12: (5, 5)
#########
#.#.....#
#.#.###.#
#.#...#.#
#.#.#.#.#
#...#.@E#
#########
Step 13: (5, 6)
#########
#.#.....#
#.#.###.#
#.#...#.#
#.#.#.#.#
#...#..@#
#########
Step 14: (5, 7)
Reached exit!