#include <bits/stdc++.h>
#include <thread>
#include <chrono>
using namespace std;
const int DR[4] = {-1, 0, 1, 0};
const int DC[4] = {0, 1, 0, -1};
void clear_screen() {
cout << "\x1B[2J\x1B[H";
}
int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
int n, m;
if (!(cin >> n >> m)) {
cout << "Input error.\n";
return 0;
}
vector<string> maze(n);
for (int i = 0; i < n; i++) {
cin >> maze[i];
if ((int)maze[i].size() != m) {
cout << "Row size error.\n";
return 0;
}
}
int sr=-1, sc=-1, er=-1, ec=-1;
for (int i=0;i<n;i++){
for (int j=0;j<m;j++){
if (maze[i][j]=='S') { sr=i; sc=j; }
if (maze[i][j]=='E') { er=i; ec=j; }
}
}
if (sr==-1 || er==-1) {
cout << "Missing S or E.\n";
return 0;
}
vector<vector<char>> visited(n, vector<char>(m, 0));
vector<vector<pair<int,int>>> parent(n, vector<pair<int,int>>(m, {-1,-1}));
queue<pair<int,int>> q;
q.push({sr, sc});
visited[sr][sc] = 1;
bool found = false;
// BFS
while (!q.empty()) {
auto [r, c] = q.front(); q.pop();
if (r == er && c == ec) {
found = true;
break;
}
for (int k = 0; k < 4; k++) {
int nr = r + DR[k], nc = c + DC[k];
if (nr < 0 || nr >= n || nc < 0 || nc >= m) continue;
if (visited[nr][nc]) continue;
if (maze[nr][nc] == '#') continue;
visited[nr][nc] = 1;
parent[nr][nc] = {r, c};
q.push({nr, nc});
}
}
if (!found) {
cout << "No path.\n";
return 0;
}
// reconstruct path
vector<pair<int,int>> path;
int r = er, c = ec;
while (!(r == sr && c == sc)) {
path.push_back({r, c});
tie(r, c) = parent[r][c];
}
path.push_back({sr, sc});
reverse(path.begin(), path.end());
// display buffer
vector<string> disp = maze;
// first position
disp[sr][sc] = '@';
clear_screen();
for (auto &row : disp) cout << row << "\n";
cout << "Step 0: (" << sr << ", " << sc << ")\n";
this_thread::sleep_for(chrono::milliseconds(250));
// animate
for (int i = 1; i < (int)path.size(); i++) {
auto [pr, pc] = path[i-1];
auto [nr, nc] = path[i];
// restore previous char
if (maze[pr][pc] == 'S') disp[pr][pc] = '.';
else disp[pr][pc] = '.';
// move @
disp[nr][nc] = '@';
clear_screen();
for (auto &row : disp) cout << row << "\n";
cout << "Step " << i << ": (" << nr << ", " << nc << ")\n";
this_thread::sleep_for(chrono::milliseconds(250));
}
cout << "Reached exit!\n";
return 0;
}
I2luY2x1ZGUgPGJpdHMvc3RkYysrLmg+CiNpbmNsdWRlIDx0aHJlYWQ+CiNpbmNsdWRlIDxjaHJvbm8+CnVzaW5nIG5hbWVzcGFjZSBzdGQ7Cgpjb25zdCBpbnQgRFJbNF0gPSB7LTEsIDAsIDEsIDB9Owpjb25zdCBpbnQgRENbNF0gPSB7MCwgMSwgMCwgLTF9OwoKdm9pZCBjbGVhcl9zY3JlZW4oKSB7CiAgICBjb3V0IDw8ICJceDFCWzJKXHgxQltIIjsKfQoKaW50IG1haW4oKSB7CiAgICBpb3M6OnN5bmNfd2l0aF9zdGRpbyhmYWxzZSk7CiAgICBjaW4udGllKG51bGxwdHIpOwoKICAgIGludCBuLCBtOwogICAgaWYgKCEoY2luID4+IG4gPj4gbSkpIHsKICAgICAgICBjb3V0IDw8ICJJbnB1dCBlcnJvci5cbiI7CiAgICAgICAgcmV0dXJuIDA7CiAgICB9CgogICAgdmVjdG9yPHN0cmluZz4gbWF6ZShuKTsKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbjsgaSsrKSB7CiAgICAgICAgY2luID4+IG1hemVbaV07CiAgICAgICAgaWYgKChpbnQpbWF6ZVtpXS5zaXplKCkgIT0gbSkgewogICAgICAgICAgICBjb3V0IDw8ICJSb3cgc2l6ZSBlcnJvci5cbiI7CiAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgIH0KICAgIH0KCiAgICBpbnQgc3I9LTEsIHNjPS0xLCBlcj0tMSwgZWM9LTE7CgogICAgZm9yIChpbnQgaT0wO2k8bjtpKyspewogICAgICAgIGZvciAoaW50IGo9MDtqPG07aisrKXsKICAgICAgICAgICAgaWYgKG1hemVbaV1bal09PSdTJykgeyBzcj1pOyBzYz1qOyB9CiAgICAgICAgICAgIGlmIChtYXplW2ldW2pdPT0nRScpIHsgZXI9aTsgZWM9ajsgfQogICAgICAgIH0KICAgIH0KCiAgICBpZiAoc3I9PS0xIHx8IGVyPT0tMSkgewogICAgICAgIGNvdXQgPDwgIk1pc3NpbmcgUyBvciBFLlxuIjsKICAgICAgICByZXR1cm4gMDsKICAgIH0KCiAgICB2ZWN0b3I8dmVjdG9yPGNoYXI+PiB2aXNpdGVkKG4sIHZlY3RvcjxjaGFyPihtLCAwKSk7CiAgICB2ZWN0b3I8dmVjdG9yPHBhaXI8aW50LGludD4+PiBwYXJlbnQobiwgdmVjdG9yPHBhaXI8aW50LGludD4+KG0sIHstMSwtMX0pKTsKCiAgICBxdWV1ZTxwYWlyPGludCxpbnQ+PiBxOwogICAgcS5wdXNoKHtzciwgc2N9KTsKICAgIHZpc2l0ZWRbc3JdW3NjXSA9IDE7CgogICAgYm9vbCBmb3VuZCA9IGZhbHNlOwoKICAgIC8vIEJGUwogICAgd2hpbGUgKCFxLmVtcHR5KCkpIHsKICAgICAgICBhdXRvIFtyLCBjXSA9IHEuZnJvbnQoKTsgcS5wb3AoKTsKICAgICAgICBpZiAociA9PSBlciAmJiBjID09IGVjKSB7CiAgICAgICAgICAgIGZvdW5kID0gdHJ1ZTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgfQoKICAgICAgICBmb3IgKGludCBrID0gMDsgayA8IDQ7IGsrKykgewogICAgICAgICAgICBpbnQgbnIgPSByICsgRFJba10sIG5jID0gYyArIERDW2tdOwogICAgICAgICAgICBpZiAobnIgPCAwIHx8IG5yID49IG4gfHwgbmMgPCAwIHx8IG5jID49IG0pIGNvbnRpbnVlOwogICAgICAgICAgICBpZiAodmlzaXRlZFtucl1bbmNdKSBjb250aW51ZTsKICAgICAgICAgICAgaWYgKG1hemVbbnJdW25jXSA9PSAnIycpIGNvbnRpbnVlOwogICAgICAgICAgICB2aXNpdGVkW25yXVtuY10gPSAxOwogICAgICAgICAgICBwYXJlbnRbbnJdW25jXSA9IHtyLCBjfTsKICAgICAgICAgICAgcS5wdXNoKHtuciwgbmN9KTsKICAgICAgICB9CiAgICB9CgogICAgaWYgKCFmb3VuZCkgewogICAgICAgIGNvdXQgPDwgIk5vIHBhdGguXG4iOwogICAgICAgIHJldHVybiAwOwogICAgfQoKICAgIC8vIHJlY29uc3RydWN0IHBhdGgKICAgIHZlY3RvcjxwYWlyPGludCxpbnQ+PiBwYXRoOwogICAgaW50IHIgPSBlciwgYyA9IGVjOwogICAgd2hpbGUgKCEociA9PSBzciAmJiBjID09IHNjKSkgewogICAgICAgIHBhdGgucHVzaF9iYWNrKHtyLCBjfSk7CiAgICAgICAgdGllKHIsIGMpID0gcGFyZW50W3JdW2NdOwogICAgfQogICAgcGF0aC5wdXNoX2JhY2soe3NyLCBzY30pOwogICAgcmV2ZXJzZShwYXRoLmJlZ2luKCksIHBhdGguZW5kKCkpOwoKICAgIC8vIGRpc3BsYXkgYnVmZmVyCiAgICB2ZWN0b3I8c3RyaW5nPiBkaXNwID0gbWF6ZTsKCiAgICAvLyBmaXJzdCBwb3NpdGlvbgogICAgZGlzcFtzcl1bc2NdID0gJ0AnOwoKICAgIGNsZWFyX3NjcmVlbigpOwogICAgZm9yIChhdXRvICZyb3cgOiBkaXNwKSBjb3V0IDw8IHJvdyA8PCAiXG4iOwogICAgY291dCA8PCAiU3RlcCAwOiAoIiA8PCBzciA8PCAiLCAiIDw8IHNjIDw8ICIpXG4iOwogICAgdGhpc190aHJlYWQ6OnNsZWVwX2ZvcihjaHJvbm86Om1pbGxpc2Vjb25kcygyNTApKTsKCiAgICAvLyBhbmltYXRlCiAgICBmb3IgKGludCBpID0gMTsgaSA8IChpbnQpcGF0aC5zaXplKCk7IGkrKykgewogICAgICAgIGF1dG8gW3ByLCBwY10gPSBwYXRoW2ktMV07CiAgICAgICAgYXV0byBbbnIsIG5jXSA9IHBhdGhbaV07CgogICAgICAgIC8vIHJlc3RvcmUgcHJldmlvdXMgY2hhcgogICAgICAgIGlmIChtYXplW3ByXVtwY10gPT0gJ1MnKSBkaXNwW3ByXVtwY10gPSAnLic7CiAgICAgICAgZWxzZSBkaXNwW3ByXVtwY10gPSAnLic7CgogICAgICAgIC8vIG1vdmUgQAogICAgICAgIGRpc3BbbnJdW25jXSA9ICdAJzsKCiAgICAgICAgY2xlYXJfc2NyZWVuKCk7CiAgICAgICAgZm9yIChhdXRvICZyb3cgOiBkaXNwKSBjb3V0IDw8IHJvdyA8PCAiXG4iOwogICAgICAgIGNvdXQgPDwgIlN0ZXAgIiA8PCBpIDw8ICI6ICgiIDw8IG5yIDw8ICIsICIgPDwgbmMgPDwgIilcbiI7CgogICAgICAgIHRoaXNfdGhyZWFkOjpzbGVlcF9mb3IoY2hyb25vOjptaWxsaXNlY29uZHMoMjUwKSk7CiAgICB9CgogICAgY291dCA8PCAiUmVhY2hlZCBleGl0IVxuIjsKICAgIHJldHVybiAwOwp9Cg==
[2J[H#########
#@#.....#
#.#.###.#
#.#...#.#
#.#.#.#.#
#...#..E#
#########
Step 0: (1, 1)
[2J[H#########
#.#.....#
#@#.###.#
#.#...#.#
#.#.#.#.#
#...#..E#
#########
Step 1: (2, 1)
[2J[H#########
#.#.....#
#.#.###.#
#@#...#.#
#.#.#.#.#
#...#..E#
#########
Step 2: (3, 1)
[2J[H#########
#.#.....#
#.#.###.#
#.#...#.#
#@#.#.#.#
#...#..E#
#########
Step 3: (4, 1)
[2J[H#########
#.#.....#
#.#.###.#
#.#...#.#
#.#.#.#.#
#@..#..E#
#########
Step 4: (5, 1)
[2J[H#########
#.#.....#
#.#.###.#
#.#...#.#
#.#.#.#.#
#.@.#..E#
#########
Step 5: (5, 2)
[2J[H#########
#.#.....#
#.#.###.#
#.#...#.#
#.#.#.#.#
#..@#..E#
#########
Step 6: (5, 3)
[2J[H#########
#.#.....#
#.#.###.#
#.#...#.#
#.#@#.#.#
#...#..E#
#########
Step 7: (4, 3)
[2J[H#########
#.#.....#
#.#.###.#
#.#@..#.#
#.#.#.#.#
#...#..E#
#########
Step 8: (3, 3)
[2J[H#########
#.#.....#
#.#.###.#
#.#.@.#.#
#.#.#.#.#
#...#..E#
#########
Step 9: (3, 4)
[2J[H#########
#.#.....#
#.#.###.#
#.#..@#.#
#.#.#.#.#
#...#..E#
#########
Step 10: (3, 5)
[2J[H#########
#.#.....#
#.#.###.#
#.#...#.#
#.#.#@#.#
#...#..E#
#########
Step 11: (4, 5)
[2J[H#########
#.#.....#
#.#.###.#
#.#...#.#
#.#.#.#.#
#...#@.E#
#########
Step 12: (5, 5)
[2J[H#########
#.#.....#
#.#.###.#
#.#...#.#
#.#.#.#.#
#...#.@E#
#########
Step 13: (5, 6)
[2J[H#########
#.#.....#
#.#.###.#
#.#...#.#
#.#.#.#.#
#...#..@#
#########
Step 14: (5, 7)
Reached exit!