Это не так сложно.
Эта часть проверяет, действительны ли параметры x или y (либо в границах, либо не заблокированы)
if(x>blocked.length-1 || y>blocked[0].length-1 || x<0 || y<0 )
return null;
if(blocked[x][y]==true)
return null;
Здесь проверяется, достигла ли позицияпункт назначения
if(x==tX && y==tY)
return "";
Теперь для рекурсивной части эта функция возвращается в четыре другие функции, каждая для доступного направления NSWE относительно текущей позиции:
String paths[]=new String[4];
blocked[x][y]=true; //this just means this coordinate is blocked, so dont use it
paths[0]=shortestPath(x, y+1, tX, tY, blocked);
paths[1]=shortestPath(x, y-1, tX, tY, blocked);
paths[2]=shortestPath(x+1, y, tX, tY, blocked);
paths[3]=shortestPath(x-1, y, tX, tY, blocked);
blocked[x][y] = false;
int result=findShortestString(paths, 0, 3);
Каждый маршрутнайденные рекурсивными функциями затем сравниваются, чтобы найти кратчайший доступный путь / строку направлений.
findShortestString (), вероятно, возвращает ноль, если каждая строка равна нулю, поэтому пункт назначения не может быть достигнут из исходной позиции этогорекурсия.
Текущая позиция рекурсии помечается как заблокированная, поэтому алгоритм не возвращается к ранее посещенной позиции.
if(paths[result]==null)
return null;
Этот параметр проверяет, не нашел ли findShortestString допустимый путь.
В конце путь найден относительно текущей позиции в рекурсииnded к направлению повторяющегося вызова, который нашел кратчайший путь.
Пример: допустим, карта имеет только один действительный путь к пункту назначения, все остальные позиции блокируются.Начальная позиция [0] [0] и пункт назначения [1] [1] (x + 1 = N, y + 1 = E) MAP:
(y-line increases upwards, x-column increases rightwards)
0D
SX
S-start
X-blocked
0-not blocked
D-destination
Первый вызов:
-x,y are within boundaries and are not the destination
-blocks current positions([0][0])
-calls function for y = y+1 -> is blocked (returns NULL)
-calls function for y = y-1 -> out of boundaries (returns NULL)
-calls function for x = x+1 -> path is ok
RECURSION:
-blocks current position[1][0]
-calls function for y = y+1 -> Destination!(returns "")
-calls function for y = y-1 -> out of boundaries(returns NULL)
-calls function for x = x+1 -> out of boundaries(returns NULL)
-calls function for x = x-1 -> blocked(returns NULL) (this would be the starting position)
Since paths[0] has the shortest string("") and the result is 'N'+""
(назад к первой итерации)
-calls function for x = x-1 -> out of boundaries(returns NULL)
Поскольку paths [2] имеет самую короткую строку, результат равен 'E' +'N'.Это правильно.
Поскольку y = y + 1 всегда вызывается первым, рекурсия выполняется до тех пор, пока она не выйдет за пределы.Затем он проверит другие позиции вокруг последней позиции и т. Д.