Я знаю, что доступно множество алгоритмов для вычисления кратчайшего пути между двумя точками в графе или сетке, например, с шириной-первым, все пары (Floyd's), Dijkstra's.
Однако, как я заметил, все эти алгоритмы вычисляют все пути в этом графе или сетке, а не только те, которые находятся между двумя интересующими нас точками.
МОЙ ВОПРОС: если у меня есть сетка, т.е. двухмерный массив, и я заинтересован в вычислении кратчайшего пути между двумя точками, скажем, P1 и P2, и если есть ограничения на способ перемещения по сетке (например, только по диагонали, или только по диагонали и вверх и т.д.), какой алгоритм может вычислить это?
Обратите внимание, что если у вас есть ответ, я бы хотел, чтобы вы опубликовали имя алгоритма, а не сам алгоритм (конечно, еще лучше, если вы также опубликуете алгоритм); например, будь то алгоритм Дейкстры, или Флойда, или что-то еще.
Пожалуйста, помогите мне, я думал об этом в течение нескольких месяцев!
Ребята, я нашел этот алгоритм на TOPCODER.COM здесь, в сетке, вы можете перемещаться только (по диагонали и вверх) но я не могу понять, какой алгоритм это каким-либо образом может кто-нибудь знать?
#include<iostream>
#include <cmath>
using namespace std;
inline int Calc(int x,int y)
{
if(abs(x)>=abs(y)) return abs(x);
int z=(abs(x)+abs(y))/2;
return z+abs(abs(x)-z);
}
class SliverDistance
{
public:
int minSteps(int x1,int y1, int x2, int y2)
{
int ret=0;
if(((x1+y1)&1)!=((x2+y2)&1))y1++,ret++;
return ret+Calc(x2-x1,y2-y1);
}
};