Полагаю, вы знаете, как это сделать за один Knigt.
Вы можете переформулировать свою проблему как линейную программу:
Я буду использовать следующие обозначения:
У нас есть N коней и N локаций.
xij = 1
, если вы выбрали рыцаря i, чтобы перейти к локации j и 0, в противном случае
cij
- минимальная длина перемещения рыцаря i до места j
Тогда у вас есть следующая линейная программа:
переменные
xij для i j в [0, N]
Функция стоимости:
C = СУММА (cij.xij для (i, j) в [0, N] x [0, N])
Ограничения:
SUM (xij для j в [1, N]) = 1 // ровно один рывок идет от i к j
СУММА (xij для i в [1, N]) = 1
(Матрица (xij) является стохастической матрицей)
если X является матрицей (xij), у вас есть n! возможная матрица Эта проблема может быть NP-Hard (не существует простого решения для этой системы, решение системы очень похоже на тестирование всех возможных решений).
EDIT:
Эта проблема называется задачей присваивания , и существует множество алгоритмов для ее решения за полиномиальное время. (посмотрите пример ответа @purav)
Как упомянул @Purav, даже если такого рода проблемы могут быть NP-сложными, в этом случае их можно решить за O (n ^ 3)
О проблеме, которую поднял @j_random_hacker:
Проблема
Если рыцарь находится в конечной точке, следующие рыцари не должны быть в состоянии
пройти через эту конечную точку. Таким образом, Cij может потребоваться обновить после
каждый рыцарь перемещается.
Примечания:
1. несколько оптимальных путей:
Поскольку на стороне шахматной доски (ограниченной шахматной доски) нет ограничений, порядок, в котором вы выполняете свой ход для достижения кратчайшего пути, не имеет значения, поэтому всегда существует много другого кратчайшего пути (я выиграл ') здесь делать комбинаторику).
Пример с 2 конями
Допустим, у вас есть 2 K и 2 конечные точки ('x'), оптимальный путь прорисован.
-x
|
|
x
|
K-- --K
вы перемещаете правую букву K к первой точке (1 ход), вторая не может использовать оптимальный путь.
-x
|
|
K
|
K-- --:
Но я могу легко создать новый оптимальный путь, вместо того, чтобы двигать 2 вправо 1 вверх, затем 2 вверх 1 вправо.
1 может двигаться 2 вверх 1 вправо, 1 вверх 2 вправо (только наоборот)
--K
|
-
| K
| |
: --:
и любая комбинация путевых работ:
1 U 2 R, затем 2 U 1 R и т. Д., Пока я держу одинаковое количество ходов
ВВЕРХ ВЛЕВО ВНИЗ и ВПРАВО и что они действительны.
2. порядок, в котором перемещаются рыцари:
Во-вторых, я могу выбрать порядок своего хода.
Пример:
с предыдущим примером, если я решил начать с левого рыцаря и перейти к верхней конечной точке, больше не будет ограничений конечной точки.
-K
|
|
x
|
:-- --K
-K
|
|
K
|
:-- --:
Этими двумя замечаниями можно было бы доказать, что не существует ситуации, в которой рассчитанная нижняя граница не является оптимальной.