Beispiel #1
0
        /// <summary>
        /// Получить дополнительные пути из заданной точки.
        /// </summary>
        /// <param name="Start">Начальная вершина.</param>
        /// <param name="Curent_way">Список пройденных путей.</param>
        /// <param name="Curent_point">Текущая вершина.</param>
        /// <returns></returns>
        List <List <Track> > Cycle(Vertex Start, List <Track> Curent_way, Vertex Curent_point)
        {
            ///Если пришли в стартавую точку отдаем путь.
            if (Curent_point == Start)
            {
                return new List <List <Track> >()
                       {
                           Curent_way
                       }
            }
            ;
            ///Если пришли в ту точку в которой были, то дальше не продолжаем.
            if (Curent_way.Any((a) => a.begin == Curent_point))
            {
                return(null);
            }
            else
            {
                ///Тут храним пути из этой точки.
                var wayFromPoint = new List <List <Track> >();
                ///Запускаем рекурсию на все пути из вершины.
                foreach (var a in Curent_point.OutWay)
                {
                    var newWay = Curent_way.ToList();
                    newWay.Add(a);
                    var Way = Cycle(Start, newWay, a.end);
                    if (Way != null)
                    {
                        wayFromPoint.AddRange(Way);
                    }
                }
                return(wayFromPoint);
            }
        }

        /// <summary>
        /// Удаление дублированных циклов.
        /// </summary>
        List <List <Track> > RemoveEqiul(List <List <Track> > IN)
        {
            List <List <Track> > OUT = IN.ToList();

            for (int i = 0; i < IN.Count; i++)
            {
                for (var j = i + 1; j < IN.Count; j++)
                {
                    if (eqiul(IN[i], IN[j]))
                    {
                        OUT.Remove(IN[j]);
                    }
                }
            }
            return(OUT);
        }

        /// <summary>
        /// Сравнение двух путей (циклов) на эквивалентность.
        /// </summary>
        bool eqiul(List <Track> T1, List <Track> T2)
        {
            foreach (var a in T1)
            {
                if (!T2.Any(b => b == a))
                {
                    return(false);
                }
            }
            return(true);
        }