#include #include #include #include using namespace std; int main() { // ofstream cout("out.txt"); int n, m; char mat[1000][1000]; cin >> n >> m; queue q; for (int i = 0; i < n; i++){ for (int j = 0; j < m; j++){ cin >> mat[i][j]; } } bool visited[1000][1000]; for (int i = 0; i < n; i++){ for (int j = 0; j < m; j++){ visited[i][j] = false; } } int di[] = {1, -1, 0, 0}; int dj[] = {0, 0, 1, -1}; for (int i = 0; i < n; i++){ for (int j = 0; j < m; j++){ if (mat[i][j] == 'S'){ q.push(i); q.push(j); q.push(0); visited[i][j] = true; } } } while (!q.empty()){ int ci, cj, dist; ci = q.front(); q.pop(); cj = q.front(); q.pop(); dist = q.front(); q.pop(); if (mat[ci][cj] == 'E'){ cout << dist << endl; return 0; } for (int i = 0; i < 4; i++){ int ti = ci + di[i], tj = cj + dj[i]; if (ti >= n or ti < 0 or tj >= m or tj < 0) continue; if (visited[ti][tj] == true) continue; if (mat[ti][tj] == '#') continue; q.push(ti); q.push(tj); q.push(dist + 1); visited[ti][tj] = true; } } int najgolem_pat = -1; for (int i = 0; i < n; i++){ for (int j = 0; j < m; j++){ if (mat[i][j] == '#'){ for (int p = 0; p < n; p++){ for (int k = 0; k < m; k++){ visited[p][k] = false; } } q.push(i); q.push(j); q.push(0); visited[i][j] = true; int diste = -1, dists = -1; while (!q.empty()){ int ci, cj, dist; ci = q.front(); q.pop(); cj = q.front(); q.pop(); dist = q.front(); q.pop(); if (mat[ci][cj] == 'E'){ diste = dist; } if (mat[ci][cj] == 'S'){ dists = dist; } for (int z = 0; z < 4; z++){ int ti = ci + di[z], tj = cj + dj[z]; if (ti >= n or ti < 0 or tj >= m or tj < 0) continue; if (visited[ti][tj] == true) continue; if (mat[ti][tj] == '#') continue; q.push(ti); q.push(tj); q.push(dist + 1); visited[ti][tj] = true; } } // cout << diste << " " << dists << endl; if(diste == -1 or dists == -1) continue; if (diste + dists > najgolem_pat){ najgolem_pat = diste + dists; } } } } cout << najgolem_pat << endl; return 0; }