Проверьте, являются ли три точки более линейными или нет

У меня есть проблема, чтобы проверить, образуют ли три точки треугольник или нет. Если он образует треугольник, программа должна напечатать квадрат максимальной длины трех сторон треугольника. Если нет, программа выведет «Coolinear».
В любом случае вот пример того, что я пробовал:

#include <iostream>
#include <cmath>
using namespace std;
int main () {
double x1,y1,x2,y2,x3,y3;
double area;
double s1,s2,s3;cin >> x1 >> y1;
cin >> x2 >> y2;
cin >> x3 >> y3;area = 0.5*abs(((x2-x1)*(y3-y1)-(x3-x1)*(y2-y1)));
s1 = ((x1-x2)*(x1-x2))+((y1-y2)*(y1-y2));
s2 = ((x2-x3)*(x2-x3))+((y2-y3)*(y2-y3));
s3 = ((x1-x3)*(x1-x3))+((y1-y3)*(y1-y3));
if (area!=0){

if (s1 >= s2 && s1 >= s3)
cout<<s1<<endl;
if (s2 >= s1 && s2 >= s3)
cout<<s2<<endl;
if (s3 >= s1 && s3 >= s2)
cout <<s3<<endl;
}

else
cout <<"Coollinear";
return 0;

}

Я разместил этот код на сайте codeforces, так как это моя последняя проблема на конкурсе. Это дает мне неправильный ответ на тесте 9, Что еще я должен использовать? и почему мой ответ неверен?

В любом случае вот текст проблемы:
Как и все решатели проблем, Meiko любит есть креп! Как мы все знаем, креп обычно подают в треугольной форме. Теперь Мейко хочет знать, насколько большой может быть сторона крепа! Поэтому он пытается нарисовать треугольник на плоскости, используя три точки, и рассчитать максимальную длину трех сторон треугольника. Но иногда он засыпает, так как он был занят командой, готовящей тренировочные задачи! В результате три точки, которые он использует, могут не образовывать треугольник, который может представлять кусок крепа! Треугольник может представлять кусок крепа, только если он имеет положительную площадь. Так что вы здесь, чтобы помочь Meiko! Учитывая координаты, используемые Мейко, определите, образуют ли они треугольник, который может представлять кусок крепа или нет.

вход
Три целочисленных координаты (X, Y), которые представляют три точки, используемые Мейко. Каждая точка на отдельной линии. (-10 ^ 9<= X, Y<= 10 ^ 9)

Выход
Если точки образуют треугольник, который может представлять собой кусок крепа, выведите квадрат максимальной длины трех сторон треугольника. В противном случае выведите «Collinear» без кавычек.

1

Решение

Если по крайней мере две стороны имеют одинаковую длину и длиннее третьей, этот код будет выдавать несколько результатов. Три if-отношения должны быть исправлены

#include <iostream>
#include <cmath>
using namespace std;
int main () {
double x1,y1,x2,y2,x3,y3;
double area;
double s1,s2,s3;cin >> x1 >> y1;
cin >> x2 >> y2;
cin >> x3 >> y3;area = 0.5*abs(((x2-x1)*(y3-y1)-(x3-x1)*(y2-y1)));
s1 = ((x1-x2)*(x1-x2))+((y1-y2)*(y1-y2));
s2 = ((x2-x3)*(x2-x3))+((y2-y3)*(y2-y3));
s3 = ((x1-x3)*(x1-x3))+((y1-y3)*(y1-y3));
if (area!=0){

if (s1 >= s2 && s1 >= s3)
cout<<s1<<endl;
else if (s2 >= s1 && s2 >= s3)
cout<<s2<<endl;
else if (s3 >= s1 && s3 >= s2)
cout <<s3<<endl;
}

else
cout <<"Coollinear";
return 0;

}
0

Другие решения

Ваш код будет выводить несколько результатов, если максимальная длина не уникальна.

Вы можете избавиться от сложной логики:

#include <algorithm>

//...
if (area == 0) {
cout << "Collinear";
}
else {
cout << max({s1, s2, s3}));
}

Позднее приложение, если это еще не решено (и я не могу спать):

Ключом к решению этой проблемы является слово «целые числа» в описании.
Тестовый пример, на котором вы терпите неудачу, построен так, что

(x2-x1)*(y3-y1)-(x3-x1)*(y2-y1)

не равен нулю при использовании чисел с плавающей запятой и нулю при использовании целых чисел

Вам не нужно 0.5 * abs(... определить, является ли область нулевой или нет, и я ожидаю, что следующее будет работать:

#include <algorithm>
#include <iostream>
using namespace std;

int square(int x) { return x * x; }

int main () {
int x1, y1, x2, y2, x3, y3;
cin >> x1 >> y1;
cin >> x2 >> y2;
cin >> x3 >> y3;

int area = (x2 - x1) * (y3 - y1) - (x3 - x1) * (y2 - y1);
if (area != 0){
int s1 = square(x1 - x2) + square(y1 - y2);
int s2 = square(x2 - x3) + square(y2 - y3);
int s3 = square(x1 - x3) + square(y1 - y3);
cout << max(s1, max(s2, s3));
}
else
{
cout <<"Collinear";
}
}
0

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector