Найти в Дзене

Задача 703. АСМ-шахматы

На сайте acmp.ru добавились 300 новых задач, и сейчас самое время их решить.

И снова задача на графы, и снова маленькие ограничения, поэтому можно легко решить на Python. Почему на графы? Потому что можно представить, что каждое состояние на доске - это вершина граф, а возможные ходы из этого состояния - рёбра. В таком представлении получаем, что надо найти длину кратчайшего пути между двумя вершинами графа. Для этого можно использовать поиск в ширину (BFS), потому что граф не взвешенный.

Для начала поймём, как будем хранить состояния. Для оптимальности с точки зрения времени и памяти надо каждое состояние кодировать каким-то числом. Но при таких ограничениях в этом нет нужды, поэтому будем хранить одной строкой из 9 символов, просто склеив строки доски.

И сразу после этого можно запустить bfs:

-2

Здесь всё стандартно: есть очередь на обработку, есть словарь used, в котором храним результат для всех обработанных вершин, и для каждой следующей вершины проверяем всех её соседей. А соседей находим с помощью генератора steps:

-3

Итого, два с половиной десятка строк, и решение задачи на 54% сложности готово.

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