#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)) {
cerr << "Error: missing or invalid sizes (n m).\n";
return 0;
}
if (n <= 0 || m <= 0 || n > 2000 || m > 2000) {
cerr << "Error: sizes out of range.\n";
return 0;
}
vector<string> maze;
maze.reserve(n);
string row;
for (int i = 0; i < n; ++i) {
if (!(cin >> row)) {
cerr << "Error: not enough rows provided (expected " << n << ").\n";
return 0;
}
if ((int)row.size() != m) {
cerr << "Error: row " << i << " has incorrect length (expected " << m << ").\n";
return 0;
}
maze.push_back(row);
}
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) {
cerr << "Error: missing S or E in maze.\n";
return 0;
}
// BFS
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;
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 from S to E.\n";
return 0;
}
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];
if (r == -1 && c == -1) { // safety
cerr << "Error reconstructing path.\n";
return 0;
}
}
path.push_back({sr,sc});
reverse(path.begin(), path.end());
// display copy
vector<string> disp = maze;
// put @ at start
disp[path[0].first][path[0].second] = '@';
// initial display
clear_screen();
for (auto &rw : disp) cout << rw << "\n";
this_thread::sleep_for(chrono::milliseconds(250));
for (size_t i = 1; i < path.size(); ++i) {
auto [pr, pc] = path[i-1];
auto [nr, nc] = path[i];
// restore previous cell to '.' unless it was S or E in original
char orig_prev = maze[pr][pc];
if (orig_prev == 'S') disp[pr][pc] = '.'; else if (orig_prev == 'E') disp[pr][pc] = 'E'; else disp[pr][pc] = '.';
// place @ in new cell (if E, keep showing @)
disp[nr][nc] = '@';
clear_screen();
for (auto &rw : disp) cout << rw << "\n";
this_thread::sleep_for(chrono::milliseconds(250));
}
cout << "Reached exit!\n";
return 0;
}
I2luY2x1ZGUgPGJpdHMvc3RkYysrLmg+CiNpbmNsdWRlIDx0aHJlYWQ+CiNpbmNsdWRlIDxjaHJvbm8+CnVzaW5nIG5hbWVzcGFjZSBzdGQ7Cgpjb25zdCBpbnQgRFJbNF0gPSB7LTEsIDAsIDEsIDB9Owpjb25zdCBpbnQgRENbNF0gPSB7MCwgMSwgMCwgLTF9OwoKdm9pZCBjbGVhcl9zY3JlZW4oKSB7CiAgICBjb3V0IDw8ICJceDFCWzJKXHgxQltIIjsKfQoKaW50IG1haW4oKSB7CiAgICBpb3M6OnN5bmNfd2l0aF9zdGRpbyhmYWxzZSk7CiAgICBjaW4udGllKG51bGxwdHIpOwoKICAgIGludCBuLCBtOwogICAgaWYgKCEoY2luID4+IG4gPj4gbSkpIHsKICAgICAgICBjZXJyIDw8ICJFcnJvcjogbWlzc2luZyBvciBpbnZhbGlkIHNpemVzIChuIG0pLlxuIjsKICAgICAgICByZXR1cm4gMDsKICAgIH0KICAgIGlmIChuIDw9IDAgfHwgbSA8PSAwIHx8IG4gPiAyMDAwIHx8IG0gPiAyMDAwKSB7CiAgICAgICAgY2VyciA8PCAiRXJyb3I6IHNpemVzIG91dCBvZiByYW5nZS5cbiI7CiAgICAgICAgcmV0dXJuIDA7CiAgICB9CgogICAgdmVjdG9yPHN0cmluZz4gbWF6ZTsKICAgIG1hemUucmVzZXJ2ZShuKTsKICAgIHN0cmluZyByb3c7CiAgICBmb3IgKGludCBpID0gMDsgaSA8IG47ICsraSkgewogICAgICAgIGlmICghKGNpbiA+PiByb3cpKSB7CiAgICAgICAgICAgIGNlcnIgPDwgIkVycm9yOiBub3QgZW5vdWdoIHJvd3MgcHJvdmlkZWQgKGV4cGVjdGVkICIgPDwgbiA8PCAiKS5cbiI7CiAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgIH0KICAgICAgICBpZiAoKGludClyb3cuc2l6ZSgpICE9IG0pIHsKICAgICAgICAgICAgY2VyciA8PCAiRXJyb3I6IHJvdyAiIDw8IGkgPDwgIiBoYXMgaW5jb3JyZWN0IGxlbmd0aCAoZXhwZWN0ZWQgIiA8PCBtIDw8ICIpLlxuIjsKICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgfQogICAgICAgIG1hemUucHVzaF9iYWNrKHJvdyk7CiAgICB9CgogICAgaW50IHNyPS0xLCBzYz0tMSwgZXI9LTEsIGVjPS0xOwogICAgZm9yIChpbnQgaT0wO2k8bjtpKyspewogICAgICAgIGZvciAoaW50IGo9MDtqPG07aisrKXsKICAgICAgICAgICAgaWYgKG1hemVbaV1bal09PSdTJykgeyBzcj1pOyBzYz1qOyB9CiAgICAgICAgICAgIGlmIChtYXplW2ldW2pdPT0nRScpIHsgZXI9aTsgZWM9ajsgfQogICAgICAgIH0KICAgIH0KCiAgICBpZiAoc3I9PS0xIHx8IGVyPT0tMSkgewogICAgICAgIGNlcnIgPDwgIkVycm9yOiBtaXNzaW5nIFMgb3IgRSBpbiBtYXplLlxuIjsKICAgICAgICByZXR1cm4gMDsKICAgIH0KCiAgICAvLyBCRlMKICAgIHZlY3Rvcjx2ZWN0b3I8Y2hhcj4+IHZpc2l0ZWQobiwgdmVjdG9yPGNoYXI+KG0sIDApKTsKICAgIHZlY3Rvcjx2ZWN0b3I8cGFpcjxpbnQsaW50Pj4+IHBhcmVudChuLCB2ZWN0b3I8cGFpcjxpbnQsaW50Pj4obSwgey0xLC0xfSkpOwogICAgcXVldWU8cGFpcjxpbnQsaW50Pj4gcTsKICAgIHEucHVzaCh7c3Isc2N9KTsKICAgIHZpc2l0ZWRbc3JdW3NjXSA9IDE7CiAgICBib29sIGZvdW5kID0gZmFsc2U7CgogICAgd2hpbGUgKCFxLmVtcHR5KCkpIHsKICAgICAgICBhdXRvIFtyLGNdID0gcS5mcm9udCgpOyBxLnBvcCgpOwogICAgICAgIGlmIChyID09IGVyICYmIGMgPT0gZWMpIHsgZm91bmQgPSB0cnVlOyBicmVhazsgfQogICAgICAgIGZvciAoaW50IGs9MDtrPDQ7aysrKXsKICAgICAgICAgICAgaW50IG5yPXIrRFJba10sIG5jPWMrRENba107CiAgICAgICAgICAgIGlmIChucjwwfHxucj49bnx8bmM8MHx8bmM+PW0pIGNvbnRpbnVlOwogICAgICAgICAgICBpZiAodmlzaXRlZFtucl1bbmNdKSBjb250aW51ZTsKICAgICAgICAgICAgaWYgKG1hemVbbnJdW25jXT09JyMnKSBjb250aW51ZTsKICAgICAgICAgICAgdmlzaXRlZFtucl1bbmNdPTE7CiAgICAgICAgICAgIHBhcmVudFtucl1bbmNdID0ge3IsY307CiAgICAgICAgICAgIHEucHVzaCh7bnIsbmN9KTsKICAgICAgICB9CiAgICB9CgogICAgaWYgKCFmb3VuZCkgewogICAgICAgIGNvdXQgPDwgIk5vIHBhdGggZnJvbSBTIHRvIEUuXG4iOwogICAgICAgIHJldHVybiAwOwogICAgfQoKICAgIHZlY3RvcjxwYWlyPGludCxpbnQ+PiBwYXRoOwogICAgaW50IHIgPSBlciwgYyA9IGVjOwogICAgd2hpbGUgKCEocj09c3IgJiYgYz09c2MpKSB7CiAgICAgICAgcGF0aC5wdXNoX2JhY2soe3IsY30pOwogICAgICAgIHRpZShyLGMpID0gcGFyZW50W3JdW2NdOwogICAgICAgIGlmIChyID09IC0xICYmIGMgPT0gLTEpIHsgLy8gc2FmZXR5CiAgICAgICAgICAgIGNlcnIgPDwgIkVycm9yIHJlY29uc3RydWN0aW5nIHBhdGguXG4iOwogICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICB9CiAgICB9CiAgICBwYXRoLnB1c2hfYmFjayh7c3Isc2N9KTsKICAgIHJldmVyc2UocGF0aC5iZWdpbigpLCBwYXRoLmVuZCgpKTsKCiAgICAvLyBkaXNwbGF5IGNvcHkKICAgIHZlY3RvcjxzdHJpbmc+IGRpc3AgPSBtYXplOwogICAgLy8gcHV0IEAgYXQgc3RhcnQKICAgIGRpc3BbcGF0aFswXS5maXJzdF1bcGF0aFswXS5zZWNvbmRdID0gJ0AnOwoKICAgIC8vIGluaXRpYWwgZGlzcGxheQogICAgY2xlYXJfc2NyZWVuKCk7CiAgICBmb3IgKGF1dG8gJnJ3IDogZGlzcCkgY291dCA8PCBydyA8PCAiXG4iOwogICAgdGhpc190aHJlYWQ6OnNsZWVwX2ZvcihjaHJvbm86Om1pbGxpc2Vjb25kcygyNTApKTsKCiAgICBmb3IgKHNpemVfdCBpID0gMTsgaSA8IHBhdGguc2l6ZSgpOyArK2kpIHsKICAgICAgICBhdXRvIFtwciwgcGNdID0gcGF0aFtpLTFdOwogICAgICAgIGF1dG8gW25yLCBuY10gPSBwYXRoW2ldOwoKICAgICAgICAvLyByZXN0b3JlIHByZXZpb3VzIGNlbGwgdG8gJy4nIHVubGVzcyBpdCB3YXMgUyBvciBFIGluIG9yaWdpbmFsCiAgICAgICAgY2hhciBvcmlnX3ByZXYgPSBtYXplW3ByXVtwY107CiAgICAgICAgaWYgKG9yaWdfcHJldiA9PSAnUycpIGRpc3BbcHJdW3BjXSA9ICcuJzsgZWxzZSBpZiAob3JpZ19wcmV2ID09ICdFJykgZGlzcFtwcl1bcGNdID0gJ0UnOyBlbHNlIGRpc3BbcHJdW3BjXSA9ICcuJzsKCiAgICAgICAgLy8gcGxhY2UgQCBpbiBuZXcgY2VsbCAoaWYgRSwga2VlcCBzaG93aW5nIEApCiAgICAgICAgZGlzcFtucl1bbmNdID0gJ0AnOwoKICAgICAgICBjbGVhcl9zY3JlZW4oKTsKICAgICAgICBmb3IgKGF1dG8gJnJ3IDogZGlzcCkgY291dCA8PCBydyA8PCAiXG4iOwogICAgICAgIHRoaXNfdGhyZWFkOjpzbGVlcF9mb3IoY2hyb25vOjptaWxsaXNlY29uZHMoMjUwKSk7CiAgICB9CgogICAgY291dCA8PCAiUmVhY2hlZCBleGl0IVxuIjsKICAgIHJldHVybiAwOwp9Cg==