@oandrew

Задачка на графах?

Update: ниже полное условие задачи


Опять решал задачки на acm, и на региональной тренировке попалась такая задачка. Сам текст задачи писать долго, так как много воды. Поэтому максимально упрощаю.

Вот суть:

Есть таблица RxS, 2<=R,S<=10. Сколько существует путей попасть с верхней левой клетки в нижнюю правую, если в пути клетки не должны повторятся?

Когда разберемся с этим, там есть еще усложнение — задаются клетки, через которые нельзя проходить.

Движение — вверх, вниз, влево, вправо.


В условии клетки через которые можно проходить задаются символом точка ".", а закрытые — решетка "#"


Примеры



.#.


Ответ: 1 (есть только один путь, его хорошо видно)





...



Ответ: 12(ну здесь не так очевидно, но вручную посчитать можно)


Так вот, я написал свой рекурсивный метод, но это простой перебор, которые при R,S > 4 уже очень долго думает. Почитал книги — ничего точного не нашел.

Вот и мучит меня эта задача. Помогите!

Полное условие задачи:


Сантехник Петя был нанят для того, что бы проложить трубу водопровода между двумя точками города. Карту города можно

представить в виде прямоугольника размером RxS, который состоит из квадратных клеток. В некоторых клетках трубу размещать нельзя.

Петя должен соединить с помощью трубы место размещенное над левой верхней клеткой и место под правой нижней клеткой.


Каждую допустимую клетку Петя может либо оставить пустой, либо поместить в нее фрагмент трубы одного из следующих 6 типов.

e1a0f6a6ded62dfafc4ffc03fb9b3cce.png


Найдите количество способов, которыми Петя может построить непрерывную трубу, которая соединяет обозначенные две точки, размещая в клетках имеющиеся у него фрагменты.


Выведите количество способов по модулю 10007


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

Первая строчка содержит целые числа R и S (2 <= R,S <= 10), количество строк и столбцов на карте города. В каждой из следующих R строк содержится ровно S символов: "." — если клетка подходит для размещения трубы, и "#" если нет.


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

Количество способов по модулю 10007


Примеры


Input

2 3



.#.

Output

1


Input

3 3







Output

12
  • Вопрос задан
  • 2946 просмотров
Пригласить эксперта
Ответы на вопрос 1
youngmysteriouslight
@youngmysteriouslight
ТК, ТТ, JS, FP, WM
Врятли моё мнение самое правильно, но так как никто более не отписался, позволю предложить следующее:

Создавая рекурсию «в лоб» мы как бы идем вглубину. Грубая оценка говорит, что порядок будет таков: 4^(R+S), поскольку в одном пути не менее R+S ходов, каждый ход порождает 4 варианта дальнейшего движения.

Можно использовать что-то типа поиска в ширину / Динамическое Программирование: каждой клетке приписать число путей, ведущих от левого верхнего края к ней, и заполнять по принципу от ближней к дальней. База: от первой вершины до себя 1 возможный путь. Переход: если клетку окружают клетки со значениями a1, a2, a3, a4 (не все могут быть определены, их временно зануляем), то значение клетки есть их минимум min(a1,a2,a3,a4). Оканчиваем, когда получим значение для правой нижней. Обход всех клеток потребует R*S шагов, такова же сложность алгоритма.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы