Какой алгоритм должен быть для построения треугольников? Доброго времени суток! Имеется лист массивов строк(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; Намекните что у меня не так? В каком ключе нужно мыслить? Заранее спасибо!
Проблема в вашем коде заключается в том, что вы не правильно выбираете вершины треугольника. Вам нужно находить все комбинации уникальных вершин из массива. Вместо использования вложенных циклов и проверок на равенство значений, вам следует использовать комбинации из трех уникальных элементов.
Вот пример алгоритма на 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;
Этот алгоритм создаст все возможные уникальные треугольники из заданного массива пар, удовлетворяющие вашим условиям. Надеюсь, это поможет вам решить вашу проблему!
Проблема в вашем коде заключается в том, что вы не правильно выбираете вершины треугольника. Вам нужно находить все комбинации уникальных вершин из массива. Вместо использования вложенных циклов и проверок на равенство значений, вам следует использовать комбинации из трех уникальных элементов.
Вот пример алгоритма на 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;
Этот алгоритм создаст все возможные уникальные треугольники из заданного массива пар, удовлетворяющие вашим условиям. Надеюсь, это поможет вам решить вашу проблему!