Exemplo n.º 1
0
        private uint _maxDepth;                                                // Максимальное значение вложенности узла

        /// <summary>
        ///    Конструктор для построения цепочек из городов
        /// </summary>
        /// <param name="towns">Массив городов</param>
        public WordTree(string[] towns)
        {
            Towns = towns;

            Parallel.ForEach(Towns, town => // Строим корневые узлы
            {
                var townSet = new HashSet <string>(Towns);
                Node <string> rootTownNode = new TownNode(town, townSet);
                lock (_rootTownSet)
                {
                    _rootTownSet.Add(rootTownNode);
                }

                rootTownNode.BuidTownTree();
            });

            foreach (var rootNode in _rootTownSet) // Находим максимальное значение вложенности
            {
                FindMaximumDepth(rootNode);
            }

            foreach (var rootNode in _rootTownSet) // Находим узлы с максимальными цепочками
            {
                FindMaximumNodes(rootNode);
            }

            foreach (var maxNode in _maxLeafs) // Строим максимальные цепочки городов
            {
                _tempChain.Clear();
                GenerateMaxChains(maxNode);
                _tempChain.AddLast(maxNode.Town);
                _maxChains.Add(new LinkedList <string>(_tempChain));
            }

            foreach (var chainList in _maxChains) // Оставляем только уникальные
            {
                var strBuilder = new StringBuilder();
                foreach (string town in chainList)
                {
                    strBuilder.Append(town).Append(" ");
                }
                _uniqueChains.Add(strBuilder.ToString());
            }
        }
Exemplo n.º 2
0
            public override void BuidTownTree()
            {
                if (Variants.Count <= 0)
                {
                    return;
                }

                foreach (string variant in Variants)
                {
                    if (char.ToLower(Town[Town.Length - 1]) != char.ToLower(variant[0]) || Town.Equals(variant))
                    {
                        continue;
                    }

                    var restVariants = new HashSet <string>(Variants);
                    restVariants.Remove(Town);
                    var townNode = new TownNode(variant, restVariants, this)
                    {
                        Depth = Depth + 1
                    };
                    Matches.Add(townNode);
                    townNode.BuidTownTree();
                }
            }