检查三个点是否线性

Check if three points are coo linear or not

本文关键字:是否 线性 三个 检查      更新时间:2023-10-16

我有一个问题可以检查三个点是否形成三角形。如果形成三角形,则程序应打印三角形三个边的最大长度的平方。如果没有,该程序将打印" 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喜欢吃crepe!众所周知,可丽饼通常以三角形形状送达。现在,迈科(Meiko)想知道可丽饼的一面有多大!因此,他试图使用三个点在平面上绘制三角形,并计算三角形的三个边的最大长度。但是有时候他忙于准备训练问题的团队,他睡着了!结果,他使用的三个点可能不会形成一个可以代表一件可丽饼的三角形!只有在具有正区域的情况下,三角形才能代表一块crepe。所以你在这里帮助迈科!鉴于Meiko使用的坐标,请确定它们是否形成一个三角形,可以代表一件可丽饼。

输入三个代表Meiko使用的三个点的整数坐标(x,y)。每个点上的每个点。(-10^9&lt; = x,y&lt; = 10^9)

输出如果点形成一个可以代表一件可丽饼的三角形,请打印三角形三个侧面的最大长度的平方。否则打印"共线"而无需引号。

如果至少两个方面的长度相同,并且比第三个侧面长,则该代码将输出多个结果。必须修复三个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;
} 

如果最大长度不是唯一的,您的代码将输出多个结果。

您可以摆脱复杂的逻辑:

#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";
    } 
}