2012-12-09 72 views
1

即時通訊無法找出以下問題。在第一點,我可以選擇第二點或第五點。從點到第三點我可以選擇第三點或第四點。從第五點我可以選擇第六點或第七點。從第七點開始,只有一條路線可以到達第九點。我想計算所有完整路徑。我不是在尋找最快的路線或任何東西。我需要所有的途徑,以便我可以輕鬆地跟蹤他們。javascript map所有路徑

我有2個問題:使用正確的方式

  1. 林不知道IM到 '存儲' 的選項(A [1] = [2,5])。這是好的還是有更好的方法?

  2. 我不知道如何解決這個問題。任何人都可以給我一個線索嗎? IM希望即時尋找在正確的方向:-)

路徑:

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); 
    } 
} 
+2

不應該是'a [7] = [8]; a [8] = [9];'? – pimvdb

+0

你的圖表中有周期嗎? (在這種情況下,你需要決定如何處理它們)。而不是爲HTML編寫半隨機值來收集數組數組中的所有路徑。也可以考慮將'trytoloop'重命名爲更有意義的東西 - 它將幫助你理解你正在嘗試做什麼...... –

+0

用'for(var y = 0; y <一個[key] .length; y ++)'會有所幫助(儘管仍然沒有達到你想要的)。 – Stuart

回答

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(",")); 
} 
+0

謝謝!我要去研究你在這裏做了什麼! – user1416256

2

我在下面提出了一個解決方案,但不要看你是否不想破壞者!它只處理圖中沒有周期的情況。

有些提示沒有提供答案:我建議在遞歸函數中,您將跟蹤第二個參數中的整個路徑,而不僅僅是當前位置,否則您最終會得到一個列表訪問過的地點,但你怎麼知道讓你到每個地點的路徑?其次,在Javascript中,使用for ... in構造遍歷數組並不被認爲是好習慣,所以您可以使用從0到數組長度的常規循環。第三,您打算在某個時間點打印出構建的路徑,但您不希望每一步都這樣做:相反,您希望在路徑完成時打印路徑;也就是說,當前位置沒有更多地方可用時。最後,我用console.log替換了document.write,因爲我相信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); 
    } 
} 
+0

*在Javascript中,您無法通過'for ... in' *循環訪問數組有點讓人誤解。有很好的理由不這樣做,但它仍然是可能的。 – Yoshi

+0

好點,我會編輯它。 OP見http://stackoverflow.com/questions/500504/javascript-for-in-with-arrays的解釋。 – Emily

+0

謝謝!我仍然試圖把我的頭圍繞這個,但有例子我確定我會弄明白。我也看看鏈接! – user1416256

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,''); 
+0

太好了,謝謝! – user1416256

1

這裏是我的解決方案:Fiddle

最後的輸出是去console,你可以改變這裏的初始節點console.log(getPaths(1));(根據你的要求從節點1開始)。