Консультация № 188558
27.12.2015, 15:47
0.00 руб.
0 2 1
Здравствуйте, уважаемые эксперты! Вот моя задача:

Дано множество A из N точек (N > 2, точки заданы своими координатами x, y).
Найти наименьший периметр треугольника, вершины которого принадлежат различным точкам множества A,
и сами эти точки (точки выводятся в том же порядке, в котором они перечислены при задании множества A).

Моя проблема - нужно выполнить проверку на то, чтобы если три точки лежали на одной прямой, их не считали за периметр. Сделать, так сказать, проверку на это.
Сама задача ниже
Заранее большое спасибо за помощь

Приложение:
#include <stdio.h>
#include <stdlib.h>
#include <windows.h>
#include <math.h>
#include <time.h>

double perper (int *a, int *b, int *c);

int main()
{
srand(time(NULL));

SetConsoleCP(1251);
SetConsoleOutputCP(1251);

int N;
printf("Введите число точек N:");
scanf("%d", &N);

if(N<2)
{
printf("Неверное значение.");
return 0;
}

int i, j, k, a[N][2], v=0, w=1, l=2;
for (i=0; i<N; i++)
{
a[i][0]=rand()%10; ///заполняем массив
a[i][1]=rand()%10;
printf("Точка номер %d координаты - %d,%d \n", i+1, a[i][0], a[i][1]);
}
double p_min=perper(a[0], a[1], a[2]); ///Параметры функции, изначально делаем мин. периметром пер. точек 1, 2,3
///c=(n*(n-1)*(n-2))/6) - кол-во треугольников
for(i=0; i<N; i++)
{
for(j=i+1; j<N; j++)
{
for(k=j+1; k<N; k++)
{
///printf("Точки %d, %d, %d - их периметр %f\n", i+1, j+1, k+1, perper(a[i], a[j], a[k]));
if(p_min>perper(a[i], a[j], a[k])) ///сравниваем текущий периметр с минимальным
{
p_min=perper(a[i], a[j], a[k]);
v=i; ///сохраняем индексы
w=j;
l=k;
}
}
}
}
printf("\n Наименьший периметр = %f, задан точками %d, %d, %d", p_min, v+1, w+1, l+1);
return 0;
}
double perper (int *a, int *b, int *c) ///указатели на точки
{
double p, e, f, d;
///sqrt((x1-x0)^2+(y1-y0)^2)
e=sqrt((b[0]-a[0])*(b[0]-a[0])+(b[1]-a[1])*(b[1]-a[1]));
f=sqrt((c[0]-b[0])*(c[0]-b[0])+(c[1]-b[1])*(c[1]-b[1]));
d=sqrt((c[0]-a[0])*(c[0]-a[0])+(c[1]-a[1])*(c[1]-a[1]));
p=e+f+d;

return p;
}

Обсуждение

давно
Посетитель
7438
7205
27.12.2015, 23:53
общий
это ответ
Здравствуйте, Klaus!
Вот Вам подпрограммка для проверки, лежат ли три точки на одной прямой
Возвращает true, если лежат
Код:

//Если векторы AB и AC коллинеарны, то точки А, В и С лежат на одной прямой
bool isLine(int *a, int *b, int *c)
{
return (((c[1]-a[1]) * (b[0]-a[0])) == ((c[0]-a[0]) * (b[1]-a[1])));
}
Об авторе:
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен
давно
Посетитель
7438
7205
27.12.2015, 23:55
общий
Адресаты:
Школьная математика [$8776$]10 класс
Об авторе:
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен
Форма ответа