Для начала, чтобы было проще искать, лучше сохранить стороны треугольников по возрастанию, то есть
z[j].n <= z[j].m <= z[j].o
Затем, вспоминаем правило подобия треугольников с учётом сортировки длин сторон:
(z[i].n / z[j].n) = (z[i].m / z[j].m) = (z[i].o / z[j].o)
Перепишем эти условия для компьютера:
(z[i].n / z[j].n) = (z[i].m / z[j].m) => ((z[i].n * z[j].m) / (z[i].m * z[j].n)) = 1
(z[i].n / z[j].n) = (z[i].o / z[j].o) => ((z[i].n * z[j].o) / (z[i].o * z[j].n)) = 1
Поскольку вещественные вычисления на компьютере дают погрешность, то условия надо преобразовать (epsilon - константа, задающая точность вычислений):
abs(((z[i].n * z[j].m) / (z[i].m * z[j].n)) - 1) < epsilon &&
abs((z[i].n * z[j].o) / (z[i].o * z[j].n)) - 1) < epsilon
Теперь начиная с первого треугольника, относим его к классу 1 проверяем его на подобие остальным и там, где треугольники подобны записываем их в класс 1.
Затем ищем треугольник, у которого класс не задан, относим его с следующему классу, проверяем его подобие остальным бесклассовым треугольникам, для подобных записываем тот же класс.
Продолжаем, пока все треугольники не будут отнесены к одному из классов.