Exemple #1
0
    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);
    }
Exemple #2
0
    public override bool Equals(object obj)
    {
        MarkedVertex markedVertex = obj as MarkedVertex;

        return(markedVertex.Vertex.Equals(Vertex));
    }