我在构建一种算法时遇到了麻烦,该算法可以在任何给定的网格中找到最长的路径。例如,假设我有一个10x10的网格。我只能正交移动。我从(1,1)开始,然后想到达(7,5)。我要到达那里的最长路径是什么?我需要算法来返回路径,在这种情况下,类似[ [0, 1], [0,2], [1,2]...
。
我在线上找到了几种不同的算法,但是它们都不返回路径,它们只是返回最长路径的长度。这是我的主要奋斗目标。
这是我目前正在使用的代码:
// Find the longest path between two coords
longestPath(start, end, dist = 0, maxDist = 0, visited = []) {
// Break case
if(start.x === end.x && start.y === end.y) {
return Math.max(dist, maxDist);
}
visited.push(start);
var obj, x = start.x, y = start.y;
// Up
obj = { x, y: y - 1 };
if (!_.find(visited, function (v) { return v.x === obj.x && v.y === obj.y }) && this.isTraversable(obj.x, obj.y)) {
maxDist = this.longestPath(obj, end, dist + 1, maxDist, visited);
}
// Down
obj = { x, y: y + 1 };
if (!_.find(visited, function (v) { return v.x === obj.x && v.y === obj.y }) && this.isTraversable(obj.x, obj.y)) {
maxDist = this.longestPath(obj, end, dist + 1, maxDist, visited);
}
// Left
obj = { x: x - 1, y };
if (!_.find(visited, function (v) { return v.x === obj.x && v.y === obj.y }) && this.isTraversable(obj.x, obj.y)) {
maxDist = this.longestPath(obj, end, dist + 1, maxDist, visited);
}
// Right
obj = { x: x + 1, y };
if (!_.find(visited, function (v) { return v.x === obj.x && v.y === obj.y }) && this.isTraversable(obj.x, obj.y)) {
maxDist = this.longestPath(obj, end, dist + 1, maxDist, visited);
}
// backtrack
_.remove(visited, function(v) {
return v.x === start.x && v.y === start.y;
});
return maxDist;
}