Запуск

mvn compile
java -classpath target/classes ru.mmineev.osp.OspApp

Алгоритм А*

Ситуации хранятся в сортируемом списке

LinkedList<Action> rangedMoves = new LinkedList<>();

Action - класс, хранящий текущее расположение фишек, путь и расстояние, и предыдущий ход.

Список сортируется по возрастанию функции сумма+стоимость

rangedMoves.sort(Comparator.comparing(Action::totalCost));

Данная функция расчитывается следующим образом:

public int totalCost() {
    return cost + distance;
}

cost - стоимость пути, количество ходов

distance - расстояние до цсуммеели

Например для белых расстояние считается по такому распределению:

9 8 7
8 7 6
7 6 5 4 3
4 3 2
3 2 1

Для черных наоборот.

Программа берет первое значение в списке (с наименьшей суммой). Получает предполагаемые варианты ходов в список и затем сортирует его.

Делается 1000 вычислений, затем предлагается лучшее по стоимости пути решение. К моменту завершения оно оказывается окончательным.

Из оптимизаций было боработано вычисление расстояния. Ранее считалось, если фишка не на том месте, где должна быть +1 расстояние. В итоге программа гоняла фишки в середине так и не трогая самые дальние.

Новый метод "заставляет" загнать фишки как можно глубже в нужную половину