Какой алгоритм должен быть для построения треугольников? Доброго времени суток! Имеется лист массивов строк(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
168 +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 Апр 2024 в 13:23
Не можешь разобраться в этой теме?
Обратись за помощью к экспертам
Гарантированные бесплатные доработки в течение 1 года
Быстрое выполнение от 2 часов
Проверка работы на плагиат
Поможем написать учебную работу
Прямой эфир