import java.util.*;
/**
* Created by wxn
* 2019/9/3 19:02
* <p>
* 题目描述:
* 假设以一个n*m的矩阵作为棋盘,每个棋位对应一个二维坐标 (x, y)。你有一颗棋子位于左上起点(0, 0),现在需要将其移动到右下底角 (n-1, m-1),棋子可以向相邻的上下左右位置移动,每个坐标最多只能经过一次。棋盘中散布着若干障碍,障碍物不能跨越,只能绕行,问是否存在到达右下底角的路线?若存在路线,输出所需的最少移动次数;若不存在,输出0。 Input 第一行三个正整数n,m和k,代表棋盘大小与障碍物个数 1< n、m < 100, k < n*m 第二行至第k+1行,每行为两个整数x和y,代表k个障碍物的坐标。
* <p>
* 输入
* 输入三个正整数n,m和k,代表棋盘大小与障碍物个数 1< n、m < 100, k < n*m
* <p>
* 第二行至第k+1行,每行为两个整数x和y,代表k个障碍物的坐标。
* <p>
* 输出
* 输出从起点到终点的最短路径的长度,如果不存在,即输出0
*/
public class Main {
static int[][] d = {
{-1, 0},
{0, 1},
{1, 0},
{0, -1}
};
static int startX = 0;
static int startY = 0;
static int endX = 0;
static int endY = 0;
static Set<Integer> stepList = new HashSet<>();
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
int n = in.nextInt();
in.nextLine();
//棋盘,障碍物为1,否则为0
/**
* 5
* .#...
* ..#S.
* .E###
* .....
* .....
*/
char[][] board = new char[n][n];
for (int i = 0; i < n; i++) {
String line = in.nextLine();
for (int j = 0; j < n; j++) {
board[i][j] = line.charAt(j);
if (board[i][j] == 'S') {
startX = i;
startY = j;
} else if (board[i][j] == 'E') {
endX = i;
endY = j;
}
}
}
shortestLength(board, n);
if (stepList.size() == 0) {
System.out.println(-1);
return;
}
int minStep = Integer.MAX_VALUE;
for (Integer integer : stepList) {
if (integer < minStep) {
minStep = integer;
}
}
System.out.println(minStep);
}
private static void shortestLength(char[][] board, int n) {
boolean[][] visited = new boolean[n][n];
visited[startX][startY] = true;
shortestLength(board, n, startX, startY, 0, visited);
}
private static void shortestLength(char[][] board, int n, int startX, int startY, int step, boolean[][] visited) {
if (startX == endX && startY == endY) {
stepList.add(step);
return;
}
for (int i = 0; i < 4; i++) {
int newX = startX + d[i][0];
int newY = startY + d[i][1];
if (newX < 0) {
newX = n - 1;
} else if (newX==n) {
newX = 0;
}
if (newY <0) {
newY = n-1;
}else if (newY==n){
newY = 0;
}
if (board[newX][newY] !='#' && !visited[newX][newY]) {
visited[newX][newY] = true;
shortestLength(board, n, newX, newY, step + 1, visited);
visited[newX][newY] = false;
}
}
}
}