2016-03-19 19 views
1

Ben verilerin belirledik:Bu grafikteki tüm yollar nasıl alınır? Recursive?

Point x = somepoint; 

Point Y = somepoint; 

List<Point> via1 = [1A, 1B, 1C]; 

List<Point> via2 = [2A, 2B, 2C, 2D]; 

... 

List<Point> vian = [nA, nB, nC]; 
(yukarıdaki gibi, bu n katmanlara genişletebilirsiniz) böyle

görsel grafik:

enter image description here

Ve sonuç olarak tüm olası yolunu almak istiyorum Bunun gibi:

List<List<Point> [ 
    List<Point> [x, 1A, 2A, y] 
    List<Point> [x, 1A, 2B, y] 
    List<Point> [x, 1A, 2C, y] 
    List<Point> [x, 1A, 2D, y] 
    List<Point> [x, 1B, 2A, y] 
    ... 
    List<Point> [x, 1C, 2D, y] 
] 

Bunu yapmanın en iyi yolu nedir? Bir grafik kitaplığına veya bazı özyinelemeli fonlara veya sadece birkaç satırlık linq'a mi ihtiyacınız var?

Teşekkür ederiz! Tam via2 ve X ve tam Y ile bağlı via2 ile bağlı via1 yana

cevap

2

tüm böyle ia s döngü gerekir: Eğer koleksiyonunu yeniden gerekiyorsa

IEnumerable<Point[]> GetPathSet() 
{ 
    foreach(var v1 in via1) 
     foreach (var v2 in via2) 
      yield return new Point[] { X, v1, v2, Y}; 
} 

sadece bir diziye veya onu dönüştürmeye Bunun gibi liste: GetPathSet().ToArray().

UPD: Eğer n önceden tanımlanmayan n katmanları ihtiyaç Eğer böyle genişletebilirsiniz: Bir inci katmanın tüm noktalar her noktaları ile bağlanır resme dayanarak

IEnumerable<List<Point>> GetPathSet(Point X, Point Y, params List<Point>[] layers) 
{ 
    int[] layerindexes = new int[layers.Length]; 
    while (true) 
    { 
     var Path = new List<Point>(); 

     Path.Add(X); 
     for (int i = 0; i < layers.Length; i++) 
      Path.Add(layers[i][layerindexes[i]]); 
     Path.Add(Y); 

     for (int i = layers.Length - 1; i >= 0; i--) 
     { 
      layerindexes[i]++; 
      if (layerindexes[i] >= layers[i].Count) 
      { 
       layerindexes[i] = 0; 
       if (i == 0) yield break; 
      } 
      else break; 
     } 

     yield return Path; 
    } 
} 
2

(n + 1) katman, tek ihtiyacınız olan "via" listeleri Kartezyen ürünü elde etmektir.

var allWays = new List<List<Point>>() 
foreach(var v1 in via1) 
    foreach (var v2 in via2) 
    ... 
     foreach (var vn in vian)   
     allWays.Add(new Point[] { X, v1, v2,..., vn, Y}); 

veya linq kullanabilirsiniz::

listeleri 'aracılığıyla" sayısının önceden tanımlanmış ise, basit iç içe döngüler kullanılabilir sen, tek işlevi gerekiyorsa, Ancak

var allWays = 
    from v1 in vai1 
    from v2 in vai2 
    ... 
    from vn in vain 
    select new [] {x, v1, v2, ..., vn, y}; 

hangi herhangi bir katman sayısı için çalışacak, ilk veri Listeler Listesi olarak sunulması gerekiyor ve kod şöyle görünecektir:

List<List<Point>> graphData; //all layers, where the first list contains x, the last one - y 

IEnumerable<IEnumerable<Point>> allWays = new[] { Enumerable.Empty<Point>() }; 
foreach (var layer in graphData) 
{ 
    var l = layer; 
    allWays = 
       from w in allWays 
       from item in l 
       select w.Concat(new[] { item }); 
} 
+0

Unuttuysanız Son snippet'te 'X' ve 'Y 'hakkında :) –

+0

Nope, :) onlar graphData listesinde var. Listenin ilk elemanı tek elemet - x içeren bir listedir. Son eleman - y. Yoruma bakın;) – rsage

+0

Oh anlıyorum. Üzgünüm, yorum yanlış. –

İlgili konular