public List <Distance> GetDistancesForUnit(Unit unit) { Vertex startVertex = unit.CurrentVertex; List <Distance> distances = new List <Distance>(); List <Vertex> targets = new List <Vertex>(); foreach (Unit targetUnit in units) { if (!targetUnit.Equals(unit)) { targets.Add(targetUnit.CurrentVertex); } } foreach (Vertex targetVertex in targets) { List <MarkedVertex> markedVertices = MarkedVertex.CreateMarkedVertexList(); int mark = 0; foreach (Vertex vertex in vertices) { markedVertices.Add(new MarkedVertex(vertex)); } MarkedVertex startMarkedVertex = MarkedVertex.Find(startVertex); startMarkedVertex.SetMark(mark); MarkedVertex targetMarkedVertex = MarkedVertex.Find(targetVertex); MarkedVertex currentMarkedVertex = startMarkedVertex; while (!targetMarkedVertex.IsMarked) { foreach (MarkedVertex markedVertex in markedVertices) { if (markedVertex.Mark == mark) { currentMarkedVertex = markedVertex; foreach (MarkedVertex markedVertexNeighbor in currentMarkedVertex.Neighbors) { if (!markedVertexNeighbor.IsMarked) { markedVertexNeighbor.SetMark(mark + 1); } } } } mark++; } currentMarkedVertex = targetMarkedVertex; List <Vertex> pathList = new List <Vertex>(); while (!currentMarkedVertex.Equals(startMarkedVertex)) { foreach (MarkedVertex markedVertexNeighbor in currentMarkedVertex.Neighbors) { if (markedVertexNeighbor.Mark + 1 == currentMarkedVertex.Mark) { pathList.Add(currentMarkedVertex.Vertex); currentMarkedVertex = markedVertexNeighbor; break; } } } pathList.Add(currentMarkedVertex.Vertex); pathList.Reverse(); Distance distance = new Distance(pathList.Count, pathList); distances.Add(distance); } return(distances); }
public override bool Equals(object obj) { MarkedVertex markedVertex = obj as MarkedVertex; return(markedVertex.Vertex.Equals(Vertex)); }