У меня проблема с 2D-сеткой, где вы пытаетесь найти кратчайший путь от (0, 0) до (N, N), где 1
Во время путешествия вы можете идти только вверх или к правильно. Точно так же ярлыки никогда не сместят вас вниз или влево.
Пример: Вы находитесь на (0, 0) и пытаетесь достичь (3, 3). Есть два ярлыка: один перемещает вас от (0, 1) к (0, 2), а другой перемещает вас от (1, 2) к (2, 3).
Лучший путь:
Перейти от (0,0) к (0,1) (1 единица). Ярлык к (0,2). Перейти от (0,2) до (1,2) (1 единица). Ярлык к (2,3). Перейдите от (2,3) к (3,3) (1 единица).
Таким образом, общая длина составит 3 единицы.
Временной интервал также составляет 2 секунды.
РЕДАКТИРОВАТЬ 1: У меня была идея использовать динамическое c программирование, чтобы сделать матрицу затрат. Матрица [i] [j] = общая стоимость пути для достижения (i, j). Однако сетка огромна, и матрица будет иметь 10 ^ 18 слотов, что слишком велико и не умещается во временные рамки.
РЕДАКТИРОВАТЬ 2: Следующей идеей было использование алгоритма Дейкстры; просто сделайте конец, начало и ярлыки всех узлов в графе. Тем не менее, это становится решением O (N ^ 2) (есть не более 10 ^ 10 ребер!)
РЕДАКТИРОВАТЬ 3: Я придумал другое решение O (N ^ 2). По сути, вы бы отсортировали все ярлыки в зависимости от их расстояния от источника. Затем вы найдете кратчайший путь к каждому ярлыку, просматривая все ярлыки, которые вы уже обработали. Вы найдете минимум (distTo (каждый ярлык) + manhattan_distance (each_shortcut, текущий ярлык)). В конце вы должны обработать точку (N, N), как если бы это был ярлык, чтобы найти ваше окончательное решение.
Однако это все еще слишком медленно - есть ли способ дальнейшей оптимизации моего решения или лучше?