Могу предложить только частичную идею, которая (возможно весьма неэффективно) находит точку встречи, если она есть. Идея сродни динамическому программированию, а может, оно и есть -- врать не стану.
Для простоты, считаем что скорости равны 1/2 и 1, а расстояния -- целые. При float расстояниях там сам препод ногу сломит, не только робот.
Еще один момент, кстати, не понятен из Вашего описания. Может ли меняться скорость робота, или это константа, внутренне ему присущая? Я буду исходить из первого предположения.
Итак. Нам понадобятся тройки из
, где
-- робот,
-- момент времени, а
-- множество мест, где он может находиться. Плюс курсор из троек, представляющих каждого робота на первый необработанный момент времени. Понятное дело, в курсоре в начале (время 0) находятся тройки, задающие начальное положение роботов.
На каждом шаге цикла мы проверяем курсор. Если все моменты времени совпали, и множества точек пересекаются по непустому множеству, мы выдаем положительный ответ, время и останавливаемся (радуясь, что нас не просили сказать, куда идти). Если не нашли, мы выбираем тройку с минимальным временем из курсора (если есть равные, нам все равно, какую), и удаляем ее из коллекции. Для каждой точки из
мы в соответсвии с матрицей и доступными скоростями вычисляем соседние точки и времена прибытия в них (с учетом доступных скоростей). Получаем
-- одноточетную тройку. Теперь, если
-- существует, добвавляем в него
, а иначе добавляем нашу новую тройку. Теперь выбираем тройку с наименьшим
(для данного робота), и ставим ее в курсор.
Проблема здесь одна. Алгоритм не остановиться сам по себе, когда решений нет. Может статься, что коли граф связный, а роботы двухскоростные, то решение есть всегда. Тогда достаточно проверить, что все роботы в одной области связности. Другой вариант -- попытаться показать, что если решение не найдено за
шагов (
-- некоторая функция от числа роботов), то его не существует. Третий -- попытаться понять, когда решения нет, и научиться идентифицировать такие ситуации.
Все, чем могу...