Какой алгоритм должен быть для построения треугольников? Доброго времени суток! Имеется лист массивов строк(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 pairs = new List();
List Triangles = new List();
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;
Намекните что у меня не так? В каком ключе нужно мыслить?
Заранее спасибо!

21 Авг 2019 в 06:06
152 +1
0
Ответы
1

Проблема в вашем коде заключается в том, что вы не правильно выбираете вершины треугольника. Вам нужно находить все комбинации уникальных вершин из массива. Вместо использования вложенных циклов и проверок на равенство значений, вам следует использовать комбинации из трех уникальных элементов.

Вот пример алгоритма на C#, который может помочь вам решить вашу задачу:

List<string[]> pairs = new List<string[]>();
List<Triangle> Triangles = new List<Triangle>();
// Сначала создаем все возможные комбинации из 3 уникальных элементов
var combinations = pairs.SelectMany((x, xi) =>
pairs.Skip(xi + 1).SelectMany((y, yi) =>
pairs.Skip(xi + yi + 2).Select(z => new { X = x, Y = y, Z = z }))
);
// Проверяем каждую комбинацию на уникальность и создаем треугольники
foreach (var combination in combinations)
{
if (combination.X.Distinct().Count() == 2
&& combination.Y.Distinct().Count() == 2
&& combination.Z.Distinct().Count() == 2
&& !combination.X.Intersect(combination.Y).Any()
&& !combination.X.Intersect(combination.Z).Any()
&& !combination.Y.Intersect(combination.Z).Any())
{
Triangles.Add(new Triangle(combination.X, combination.Y, combination.Z));
}
}
Console.WriteLine(Triangles);
return Triangles;

Этот алгоритм создаст все возможные уникальные треугольники из заданного массива пар, удовлетворяющие вашим условиям. Надеюсь, это поможет вам решить вашу проблему!

20 Апр в 13:23
Не можешь разобраться в этой теме?
Обратись за помощью к экспертам
Название заказа не должно быть пустым
Введите email
Бесплатные доработки
Гарантированные бесплатные доработки
Быстрое выполнение
Быстрое выполнение от 2 часов
Проверка работы
Проверка работы на плагиат
Интересные статьи из справочника
Поможем написать учебную работу
Название заказа не должно быть пустым
Введите email
Доверьте свою работу экспертам
Разместите заказ
Наша система отправит ваш заказ на оценку 92 436 авторам
Первые отклики появятся уже в течение 10 минут
Прямой эфир