我有一个问题要检查三个点是否形成三角形。如果它形成一个三角形,程序应该打印三角形三边最大长度的平方。如果没有,该程序将打印“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)
输出 如果这些点形成一个可以代表一块绉纱的三角形,则打印三角形三边最大长度的正方形。否则打印没有引号的“共线”。
答案 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";
}
}