检查三个点是否为线性

时间:2017-12-07 13:56:53

标签: c++ math equation equation-solving

我有一个问题要检查三个点是否形成三角形。如果它形成一个三角形,程序应该打印三角形三边最大长度的平方。如果没有,该程序将打印“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想知道绉边有多大!因此,他尝试使用三个点在平面上绘制一个三角形,并计算三角形三边的最大长度。但有时他会因为忙着准备培训问题的团队而入睡!结果,他使用的三个点可能不会形成一个可以代表一块绉纱的三角形!只有在具有正面积的情况下,三角形才能代表一块绉纱。所以你在这里帮助Meiko!考虑到Meiko使用的坐标,确定它们是否形成一个可以代表一块绉纱的三角形。

输入 三个整数坐标(X,Y)代表Meiko使用的三个点。每个点在一个单独的行上。 (-10 ^ 9版; = X中,Y = 10 ^ 9)

输出 如果这些点形成一个可以代表一块绉纱的三角形,则打印三角形三边最大长度的正方形。否则打印没有引号的“共线”。

2 个答案:

答案 0 :(得分:0)

如果至少两个边具有相同的长度且长于第三个边,则此代码将输出多个结果。必须修复三个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;

} 

答案 1 :(得分: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";
    } 
}