Кратчайший путь в сетке

Дан лабиринт, представленный в виде сетки из r строк и c столбцов. Вам необходимо определить длину кратчайшего пути от стартовой клетки до конечной.
Лабиринт обозначен так:
  • Проходимые клетки указаны точками (.).
  • Стены обозначены символами решётки (#).
  • Стартовая точка помечена заглавной буквой S.
  • Конечная клетка помечена заглавной буквой E.
Вы можете перемещаться по соседним клеткам (влево, вправо, вверх или вниз), если там нет стены.
Требуется вычислить длину кратчайшего пути между клеткой S и клеткой E.

Входные данные

Первая строка содержит два целых числа r и c (1 ≤ r, c ≤ 1000).
Следующие r строк содержат по c символов, описывающих сетку. Каждая клетка может быть либо проходной (.), либо стеной (#), либо стартовой (S), либо конечной (E). Гарантируется, что во всей сетке существует ровно одна клетка S и ровно одна клетка E.

Выходные данные

Программа должна вывести длину кратчайшего пути от S до E. Если пути от S до E не существует, выведите Impossible.

Примеры

Input

5 8
########
##.S....
....#.#.
#......#
...#...E
Output

7
 
 
Подсказка
Не всегда обязательно явно строить граф, чтобы запустить алгоритм BFS (поиск в ширину). Иногда достаточно использовать неявное представление графа, например сетку, и всё равно выполнять на ней поиск в ширину.
Намёк
Можно считать сетку графом и хранить двумерный массив расстояний d[][], который отражает кратчайшее расстояние от стартовой клетки до текущей.
 

Constraints

Time limit: 15 seconds

Memory limit: 512 MB

Output limit: 1 MB

To check your solution you need to sign in
Sign in to continue