private void BruteForceMapping(int jlmIndex, HashSet <int> txtOut, HashSet <int> txtOut2,
                                           Dictionary <JunctionLabelMapping, int> mapping, double sumDist)
            {
                JunctionLabelMapping jlm = mappingsToSolve[jlmIndex];

                bool possiblePairFound = false;

                for (int i = 0; i < jlm.CompatitorMappingsCount && i < jlm.MappingPriorityList.Count; i++)
                {
                    possiblePairFound = CheckLabelRelation(jlmIndex, txtOut, txtOut2, mapping, sumDist, jlm, i);
                }

                if (!possiblePairFound)
                {
                    needReverseBruteForceSearch = true;//выполнить поиск сочетаний в обратном порядке
                    //проверить оставшиеся варианты если есть пока не найдется возможная пара
                    for (int i = jlm.CompatitorMappingsCount; i < jlm.MappingPriorityList.Count; i++)
                    {
                        possiblePairFound = CheckLabelRelation(jlmIndex, txtOut, txtOut2, mapping, sumDist, jlm, i);
                        if (possiblePairFound)
                        {
                            break;
                        }
                    }
                }

                if (!possiblePairFound)
                {
                    //текстов меньше чем присодинений
                    if (jlmIndex != mappingsToSolve.Count - 1)
                    {
                        //тем не менее перейти к следующему присоединению если это не последнее
                        BruteForceMapping(jlmIndex + 1, txtOut, txtOut2, mapping, sumDist);
                    }
                    else
                    {
                        //завершить проход если это последнее
                        if (CheckCandidateMapping(mapping, sumDist))
                        {
                            mappingResult   = mapping;
                            mappingDistance = sumDist;
                        }
                    }
                }
            }
            private bool CheckLabelRelation(int jlmIndex, HashSet <int> txtOut, HashSet <int> txtOut2,
                                            Dictionary <JunctionLabelMapping, int> mapping, double sumDist, JunctionLabelMapping jlm, int i)
            {
                bool possiblePairFound = false;

                JunctionLabelMapping.LabelRelation lr = jlm.MappingPriorityList[i];
                int currLrHashCode = lr.GetHashCode();
                int currLrContent  = Convert.ToInt32(lr.TextPosition.TextContent.Trim());

                if (!txtOut.Contains(currLrHashCode) && //не допускать один и тот же текст
                    !txtOut2.Contains(currLrContent))   //не допускать 2 одинаковые цифры
                {
                    possiblePairFound = true;

                    Dictionary <JunctionLabelMapping, int> mappingNextStep
                        = new Dictionary <JunctionLabelMapping, int>(mapping);
                    HashSet <int> txtOutNextStep  = new HashSet <int>(txtOut);
                    HashSet <int> txtOut2NextStep = new HashSet <int>(txtOut2);
                    double        sumDistNextStep = sumDist + lr.Distance /* + lr.DistanceToNode*/;

                    txtOutNextStep.Add(currLrHashCode);
                    txtOut2NextStep.Add(currLrContent);
                    mappingNextStep.Add(jlm, i);


                    if (jlmIndex != mappingsToSolve.Count - 1)
                    {
                        //переход к следующему отрезку
                        BruteForceMapping(jlmIndex + 1, txtOutNextStep, txtOut2NextStep, mappingNextStep, sumDistNextStep);
                    }
                    else
                    {
                        //это последний отрезок в этом проходе
                        if (CheckCandidateMapping(mappingNextStep, sumDistNextStep))
                        {
                            mappingResult   = mappingNextStep;
                            mappingDistance = sumDistNextStep;
                        }
                    }
                }

                return(possiblePairFound);
            }