Статистика решения: 10,98% участников полностью решили задачу, 42,68% набрали 0 баллов.
Решение задачи:
Для решения задачи необходимо использовать двумерный массив board. Элемент массива board[x][y] хранит минимальное расстояние, за которое можно добраться от клетки с координатами (x; y) до кормушки (S; T). Элемент этого массива не превысит значения 250, так как блохи прыгают конем, прыгают «в ширь», а также не прыгают на уже достигнутые клетки. Удобнее решать задачу с конца, то есть находить не расстояние от каждой блохи до кормушки, а расстояние от кормушки до всех потенциальных позиций блох на доске. Рассмотрим решение на первом примере:
Закрашенные клетки – на текущий момент это не достижимые клетки. В начале работы алгоритма массив board представлен на рис. 1. На первом шаге (рис. 2), по алгоритму волны надо просмотреть возможные пути конем в закрашенные клетки из ячеек, содержащих 0, и присвоить им значение 1. На втором шаге (рис. 3) надо просмотреть все возможные пути конем в закрашенные клетки из ячеек, содержащих 1. Таким образом, каждый раз надо увеличивать длину пути на единицу. В итоге (рис. 6) получена доска, с расстояниями от каждой клетки до кормушки.
Для обоих, рассматриваемых ниже, реализаций этой идеи целесообразно завести массив с запасом на 2 ячейки по горизонтали и по вертикали, пометив их как запретные, чтобы было удобнее контролировать ходы за границу доски.
1 способ. Решение этой задачи сводится к алгоритму волны. Псевдокод будет выглядеть следующим образом:
while <были проведены изменения> do begin
for i := 1 to N do
for j := 1 to M do
if board[i][j] = <текущий шаг> then
<незанятые клетки «на расстоянии коня»> := <текущий шаг> + 1;
<увеличить текущий шаг>;
end;
Осталось только посчитать сумму длин путей. Сложность этого алгоритма порядка
2 способ. Очевидна неэффективность первого способа. Применение очереди дает значительный выигрыш, а сложность алгоритма будет оцениваться . Суть заключается в следующем:
изначально в очередь ставиться клетка с координатами кормушки, board[S][T] присваивается 0;
взять из очереди следующий элемент, далее по порядку заполняются незанятые клетки «на расстоянии коня» в board и одновременно, в случае заполнения, эта клетка ставиться в очередь;
делать пункт 2 пока очередь не пуста.
Блохи сидят на клетках шахматного поля и ходят конем. Должны собраться в одной из клеток. Определить сумму длин кратчайших путей.
На клеточном поле, размером \(N\)x\(M\) (2 ≤ \(N\), \(M\) ≤ 250) сидит \(Q\) (0 ≤ \(Q\) ≤ 10000) блох в различных клетках. "Прием пищи" блохами возможен только в кормушке - одна из клеток поля, заранее известная. Блохи перемещаются по полю странным образом, а именно, прыжками, совпадающими с ходом обыкновенного шахматного коня. Длина пути каждой блохи до кормушки определяется как количество прыжков. Определить минимальное значение суммы длин путей блох до кормушки или, если собраться блохам у кормушки невозможно, то сообщить об этом. Сбор невозможен, если хотя бы одна из блох не может попасть к кормушке.
Выходные данные
Содержит одно число - минимальное значение суммы длин путей или -1, если сбор невозможен.