最长路径算法

时间:2019-01-26 20:27:24

标签: node.js algorithm

我在构建一种算法时遇到了麻烦,该算法可以在任何给定的网格中找到最长的路径。例如,假设我有一个10x10的网格。我只能正交移动。我从(1,1)开始,然后想到达(7,5)。我要到达那里的最长路径是什么?我需要算法来返回路径,在这种情况下,类似[ [0, 1], [0,2], [1,2]...

picture example

我在线上找到了几种不同的算法,但是它们都不返回路径,它们只是返回最长路径的长度。这是我的主要奋斗目标。

这是我目前正在使用的代码:

  // 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;
  }

0 个答案:

没有答案