Пути по игровому полю с ловушками

тема: Комбинаторика и множества · уровень: средний

Условие

В игре герой идёт по прямоугольному полю размером h×w. Он стартует в левом верхнем углу и должен дойти в правый нижний.

За один ход он может:

Некоторые клетки — ловушки, на них заходить нельзя.

Посчитайте, сколькими способами можно добраться до финиша.

Важно: ответ может не помещаться в 32-битный тип (как на олимпиадах), но гарантированно помещается в 64-битный. В Python это не проблема.

Формат ввода

Гарантируется, что клетки (1,1) и (h,w) — свободные (символ .).

Формат вывода Выведите одно целое число — количество допустимых путей.

Ограничения

Пример Ввод:

3 4
....
.#..
....

Вывод:

4

Как решать — идея подхода

Приём: Динамическое программирование на решётке

Ключевое наблюдение: чтобы попасть в клетку (i, j), герой может прийти только из двух мест — (i-1, j) сверху или (i, j-1) слева. Значит, число способов добраться до (i, j) зависит только от уже посчитанных соседей.

Это классическое динамическое программирование (ДП): заполняем таблицу слева направо, сверху вниз, и в каждой клетке храним ответ «сколько путей ведёт сюда, не наступая на ловушки».

План:

Почему это работает: любой допустимый путь в (i, j) обязательно заканчивается шагом «вниз» или «вправо», а ловушки просто запрещают состояние.

Сложность: O(h*w) по времени и O(h*w) по памяти (при желании можно ужать до O(w)).

Частая ошибка: забыть обнулить dp на ловушках или неправильно обработать первую строку/первый столбец (там есть только один источник).

Разберись руками

Поле 3×4. Старт в левом верхнем углу, финиш в правом нижнем. Ходить можно только вправо (R) или вниз (D), а клетка во 2-й строке и 2-м столбце — ловушка (#), на неё наступать нельзя.

Идея: Путь можно представить как последовательность ходов вправо и вниз. На маленьком поле удобно выписать все такие последовательности, «пройти» по каждой и вычеркнуть те, которые заходят в ловушки. Оставшиеся просто пересчитать.

Решить задачу с автопроверкой на Python →

Куда дальше