samutin
@samutin
Начинающий WEB-программист

Какой алгоритм должен быть для построения треугольников?

Доброго времени суток! Имеется лист массивов строк(List), где каждый элемент листа состоит из 2-х строк и является уникальным, а в паре не может быть двух одинаковых значений (не может быть "[Ntv, Ntv]"). Требуется создать лист уникальных треугольников, где вершины это значения пар. Необходим именно алгоритм, до которого я всё никак не могу допереть.
Пример готового треугольника:
Triangles.Add(new Triangle(X, Y, Z)), где X=[Ntv, Tbh], Y=[Vyt, Tbh], Z=[Vyt, Ntv]
Пример листа:
[
   [Ntv, Tbh],
   [Vyt, Tbh],
   [Roh, Vyt],
   [Roh, Ntv],
   [Vyt, Ntv]
   ...
]

Имеется код на C#, но он работает не корректно (есть повторяющиеся треугольника, у которых вершины имеют разную очередность).
Сам код:
List<string[]> pairs = new List<string[]>();
List<Triangle> Triangles = new List<Triangle>();
foreach (string x in pairs)
{
    string[] X = pairs;
    foreach (string y in pairs)
    {
        string[] Y = pairs;
        if ((X[0] == Y[0] || X[0] == Y[1] || X[1] == Y[0] || X[1] == Y[1]) && !Equals(X, Y))
        {
            foreach (string z in pairs)
            {
                string[] Z = pairs;
                if (
                    X[0] == Y[0] && ((Z[0] == X[1] && Z[1] == Y[1]) || (Z[1] == X[1] && Z[0] == Y[1])) ||
                    X[0] == Y[1] && ((Z[0] == X[1] && Z[1] == Y[0]) || (Z[1] == X[1] && Z[0] == Y[0])) ||
                    X[1] == Y[0] && ((Z[0] == X[0] && Z[1] == Y[1]) || (Z[1] == X[0] && Z[0] == Y[1])) ||
                    X[1] == Y[1] && ((Z[0] == X[0] && Z[1] == Y[0]) || (Z[1] == X[0] && Z[0] == Y[0]))
                    )
                Triangles.Add(new Triangle(X, Y, Z));
            }
        }
    }
}
Console.WriteLine(Triangles);
return Triangles;

Намекните что у меня не так? В каком ключе нужно мыслить?
Заранее спасибо!
  • Вопрос задан
  • 322 просмотра
Решения вопроса 1
Rsa97
@Rsa97
Для правильного вопроса надо знать половину ответа
В принципе, ваш алгоритм рабочий, только перебирать надо не все отрезки в каждом цикле, а только те, что лежат ниже. То есть
for (i = 0; i < pairs.length-2; i++) {
  ... 
  for (i = i+1; j < pairs.length-1; j++) {
    ...
    for (k = j+1; k < pairs.length; k++) {
      ...
    }
  }
}
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через TM ID
Похожие вопросы