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. cerr << "Error: missing or invalid sizes (n m).\n";
  20. return 0;
  21. }
  22. if (n <= 0 || m <= 0 || n > 2000 || m > 2000) {
  23. cerr << "Error: sizes out of range.\n";
  24. return 0;
  25. }
  26.  
  27. vector<string> maze;
  28. maze.reserve(n);
  29. string row;
  30. for (int i = 0; i < n; ++i) {
  31. if (!(cin >> row)) {
  32. cerr << "Error: not enough rows provided (expected " << n << ").\n";
  33. return 0;
  34. }
  35. if ((int)row.size() != m) {
  36. cerr << "Error: row " << i << " has incorrect length (expected " << m << ").\n";
  37. return 0;
  38. }
  39. maze.push_back(row);
  40. }
  41.  
  42. int sr=-1, sc=-1, er=-1, ec=-1;
  43. for (int i=0;i<n;i++){
  44. for (int j=0;j<m;j++){
  45. if (maze[i][j]=='S') { sr=i; sc=j; }
  46. if (maze[i][j]=='E') { er=i; ec=j; }
  47. }
  48. }
  49.  
  50. if (sr==-1 || er==-1) {
  51. cerr << "Error: missing S or E in maze.\n";
  52. return 0;
  53. }
  54.  
  55. // BFS
  56. vector<vector<char>> visited(n, vector<char>(m, 0));
  57. vector<vector<pair<int,int>>> parent(n, vector<pair<int,int>>(m, {-1,-1}));
  58. queue<pair<int,int>> q;
  59. q.push({sr,sc});
  60. visited[sr][sc] = 1;
  61. bool found = false;
  62.  
  63. while (!q.empty()) {
  64. auto [r,c] = q.front(); q.pop();
  65. if (r == er && c == ec) { found = true; break; }
  66. for (int k=0;k<4;k++){
  67. int nr=r+DR[k], nc=c+DC[k];
  68. if (nr<0||nr>=n||nc<0||nc>=m) continue;
  69. if (visited[nr][nc]) continue;
  70. if (maze[nr][nc]=='#') continue;
  71. visited[nr][nc]=1;
  72. parent[nr][nc] = {r,c};
  73. q.push({nr,nc});
  74. }
  75. }
  76.  
  77. if (!found) {
  78. cout << "No path from S to E.\n";
  79. return 0;
  80. }
  81.  
  82. vector<pair<int,int>> path;
  83. int r = er, c = ec;
  84. while (!(r==sr && c==sc)) {
  85. path.push_back({r,c});
  86. tie(r,c) = parent[r][c];
  87. if (r == -1 && c == -1) { // safety
  88. cerr << "Error reconstructing path.\n";
  89. return 0;
  90. }
  91. }
  92. path.push_back({sr,sc});
  93. reverse(path.begin(), path.end());
  94.  
  95. // display copy
  96. vector<string> disp = maze;
  97. // put @ at start
  98. disp[path[0].first][path[0].second] = '@';
  99.  
  100. // initial display
  101. clear_screen();
  102. for (auto &rw : disp) cout << rw << "\n";
  103. this_thread::sleep_for(chrono::milliseconds(250));
  104.  
  105. for (size_t i = 1; i < path.size(); ++i) {
  106. auto [pr, pc] = path[i-1];
  107. auto [nr, nc] = path[i];
  108.  
  109. // restore previous cell to '.' unless it was S or E in original
  110. char orig_prev = maze[pr][pc];
  111. if (orig_prev == 'S') disp[pr][pc] = '.'; else if (orig_prev == 'E') disp[pr][pc] = 'E'; else disp[pr][pc] = '.';
  112.  
  113. // place @ in new cell (if E, keep showing @)
  114. disp[nr][nc] = '@';
  115.  
  116. clear_screen();
  117. for (auto &rw : disp) cout << rw << "\n";
  118. this_thread::sleep_for(chrono::milliseconds(250));
  119. }
  120.  
  121. cout << "Reached exit!\n";
  122. return 0;
  123. }
  124.  
  125.  
Success #stdin #stdout 0.01s 5288KB
stdin
7 9
#########
#S#.....#
#.#.###.#
#.#...#.#
#.#.#.#.#
#...#..E#
#########
stdout
#########
#@#.....#
#.#.###.#
#.#...#.#
#.#.#.#.#
#...#..E#
#########
#########
#.#.....#
#@#.###.#
#.#...#.#
#.#.#.#.#
#...#..E#
#########
#########
#.#.....#
#.#.###.#
#@#...#.#
#.#.#.#.#
#...#..E#
#########
#########
#.#.....#
#.#.###.#
#.#...#.#
#@#.#.#.#
#...#..E#
#########
#########
#.#.....#
#.#.###.#
#.#...#.#
#.#.#.#.#
#@..#..E#
#########
#########
#.#.....#
#.#.###.#
#.#...#.#
#.#.#.#.#
#.@.#..E#
#########
#########
#.#.....#
#.#.###.#
#.#...#.#
#.#.#.#.#
#..@#..E#
#########
#########
#.#.....#
#.#.###.#
#.#...#.#
#.#@#.#.#
#...#..E#
#########
#########
#.#.....#
#.#.###.#
#.#@..#.#
#.#.#.#.#
#...#..E#
#########
#########
#.#.....#
#.#.###.#
#.#.@.#.#
#.#.#.#.#
#...#..E#
#########
#########
#.#.....#
#.#.###.#
#.#..@#.#
#.#.#.#.#
#...#..E#
#########
#########
#.#.....#
#.#.###.#
#.#...#.#
#.#.#@#.#
#...#..E#
#########
#########
#.#.....#
#.#.###.#
#.#...#.#
#.#.#.#.#
#...#@.E#
#########
#########
#.#.....#
#.#.###.#
#.#...#.#
#.#.#.#.#
#...#.@E#
#########
#########
#.#.....#
#.#.###.#
#.#...#.#
#.#.#.#.#
#...#..@#
#########
Reached exit!