ЗАДАЧИ
problems.ru |
О проекте
|
Об авторах
|
Справочник
Каталог по темам | по источникам | |
|
Задача 102889
УсловиеИгра «Хамелеон» происходит в квадрате 3 × 3, в клетках которого находятся 8 фишек с буквами этого слова, а одна из клеток пуста. За один ход разрешается одну из фишек переместить на соседнюю пустую клетку. Цель игры – достигнуть расположения фишек, указанного на рисунке.
Напишите программу, которая определяет план достижения цели за
минимально возможное число ходов, либо сообщает, что цели достичь нельзя.
РешениеСкачать архив тестов и решенийПостроим граф, вершины которого будут соответствовать возможным конфигурациям игры, а ребра – разрешенным правилами переходам между ними. (Мы получим граф с 9! / 2 = 181440 вершинами, каждой из которых инцидентно от 2 до 4 ребер.) Тогда наша исходная задача о поиске кратчайшей последовательности ходов сведется к задаче о нахождении кратчайшего пути в графе от заданной вершины до вершины, соответствующей конфигурации с рисунка. Для решения последней используем алгоритм поиска в ширину. В данной задаче искомый путь всегда будет существовать. Действительно, несложно показать, что мы можем получить любую перестановку исходных букв (если читать квадрат 3 × 3 слева направо и сверху вниз) той же четности, что и исходная. Но за счет того, что у нас имеются две одинаковые буквы Е, требуемое расположение фишек всегда достижимо. Для нахождения всех вершин кратчайшего пути необходимо при поиске в ширину для каждой посещенной вершины v запоминать ту вершину, из которой мы пришли в v. Необязательно хранить ее номер, достаточно хранить, в каком из четырех направлений перемещалась пустая клетка. Другая проблема, с которой мы сталкиваемся в этой задаче, состоит в
нумерации конфигураций числами. Алгоритмы такого типа обсуждаются в
главе 5. Кроме того, при реализации решения в некоторых системах
программирования, ограничивающих размер сегментов стека и данных 64
килобайтами (такой средой является, например, Turbo
Pascal), возникает необходимость либо работать с динамической памятью, либо использовать для
хранения структур данных как сегмент данных, так и сегмент стека, и при этом
еще и использовать битовые вычисления.
Источники и прецеденты использования |
© 2004-...
МЦНМО
(о копирайте)
|
Пишите нам
|
![]() |