javascript映射所有路径

时间:2012-12-09 19:36:43

标签: javascript

我无法弄清楚以下问题。在第1点,我可以转到第2点或第5点。从点到我可以转到3或4.从第5点开始,我可以转到6或7.从7开始,只有一条到达9的路径。我想要计算所有完整路径。我不是在寻找最快的路线或任何东西。我需要所有路径,以便我可以轻松地遵循它们。

我有两个问题:

  1. 我不确定我是否使用正确的方法来“存储”选项(a [1] = [2,5])。这样可以,还是有更好的方法?

  2. 我不知道如何解决这个问题。任何人都可以给我一个线索吗?我希望我正朝着正确的方向前进: - )

  3. 路径:

      1 ->2 ->3
            ->4
        ->5 ->6
            ->7 ->8 ->9
    

    期望的结果:

     1,2,3
     1,2,4
     1,5,6
     1,5,7,8,9
    

    我尝试在javascript中解决此问题

    // this doesn't do what I need 
    var a = [];
    a[1]=[2,5];    
    a[2]=[3,4];
    a[5]=[6,7];
    a[7]=[8];
    a[8]=[9];
    
    trytoloop(a,1);
    
    function trytoloop(a,key){
        if(a[key]){
             for (var y in a[key]){
                    document.write(key);
    
                    trytoloop(a,a[key][y]);
             }
        } else {
            document.write(key);
        }
    }
    

4 个答案:

答案 0 :(得分:2)

我在下面提出了一个解决方案,但如果你不想要剧透,请不要看!它仅处理图中没有循环的情况。

一些提示没有给出答案:我建议在你的递归函数中,你在第二个参数中跟踪到目前为止的整个路径,而不仅仅是当前位置,否则你最终会得到一个列表访问过的地点但你怎么知道每个人的路径?其次,在Javascript中,使用for ... in构造迭代数组并不是一种好习惯,因此您可以使用从0到数组长度的常规for循环。第三,你想要在某个时刻打印出构造的路径,但是你不想在每一步都这样做:相反,你想要在它完成时打印出路径;也就是说,当前位置没有其他地方可以去。最后,我将document.write替换为console.log,因为我相信每次打印时document.write都会覆盖文档内容。

var a = [];
a[1]=[2,5];
a[2]=[3,4];
a[5]=[6,7];
a[7]=[8,9];

trytoloop(a,[1]);

function trytoloop(a,path){
  var last = path[path.length - 1];
  var next_hops = a[last];
  // if there could be cycles, you might want to check that next_hops doesn't
  // contain any already visited locations
  if (next_hops) {
    for (var i = 0; i < next_hops.length; i++) {
      var new_path = path.concat([next_hops[i]]);
      trytoloop(a, new_path);
    }
  } else {
    console.log(path);
  }
}

答案 1 :(得分:2)

您无法跟踪到目前为止已建立的部分路径。但阵列的想法似乎很好。这是一个有一些更有意义的名字的工作版本:http://jsfiddle.net/YkH5b/

// A cleaner way of defining the next keys
var nextKeysMap = {
    1: [2, 5],    
    2: [3, 4],
    5: [6, 7],
    7: [8],
    8: [9]
};

var fullPaths = [];
generateFullPaths([1], 1);  // start off with partial path [1] and thus at key 1

function generateFullPaths(partialPath, currentKey) {
    if(currentKey in nextKeysMap) {  // can we go further?
        var nextKeys = nextKeysMap[currentKey];  // all possible next keys
        for (var i = 0; i < nextKeys.length; i++) {  // loop over them
            var nextKey = nextKeys[i];
            // append the current key, and build the path further
            generateFullPaths(partialPath.concat(nextKey), nextKey);
         }
    } else {  // we cannot go further, so this is a full path
        fullPaths.push(partialPath);
    }
}

for(var i = 0; i < fullPaths.length; i++) {
    console.log(fullPaths[i].join(","));
}

答案 2 :(得分:1)

我没有试过这个,但是在我的脑海中,你可以尝试这些方法:

// use an object, and set the numbers as keys and the values as the child options
var a = {};
a[1] = {2:{3:{},4:{}},5:{6:{},7:{8:{9:{}}}}};

(function trytoloop(obj,num,str){
    if(str.length>0) str += ',';
    str += num
    if(Object.keys(obj).length==0) document.writeln(str+'<br />');
    else for(var key in obj) trytoloop(obj[key],key,str);
})(a[1],1,'');

答案 3 :(得分:1)

这是我的解决方案:Fiddle

最终输出到console,你可以在这里更改console.log(getPaths(1));的初始节点(根据你的要求从节点1开始)。