gpt4 book ai didi

c++ - 使用三个点(x,y),如何判断它是不是三角形

转载 作者:搜寻专家 更新时间:2023-10-31 01:30:33 24 4
gpt4 key购买 nike

我在 codeforces 中有一个作业,上面写着:
像所有问题解决者一样,Ebram 喜欢吃可丽饼!众所周知,可丽饼通常呈三角形。现在 Ebram 想知道绉纱面可以有多大!于是他试着用三个点在一个平面上画一个三角形,并计算三角形三边的最大长度。但有时他会睡着,因为他一直忙于团队准备训练问题!这样一来,他用的三个点未必能组成一个可以代表薄饼的三角形!只有面积为正数的三角形才能代表一 block 绉纱。所以你是来帮助 Ebram 的!给定 Ebram 使用的坐标,确定它们是否形成可以代表一 block 绉纱的三角形。

输入:代表 Ebram 使用的三个点的三个整数坐标 (X,Y)。每个点在一条单独的线上。

输出:如果点组成一个三角形可以代表一 block 可丽饼,打印三角形三边最大长度的正方形。否则打印“可怜的男孩”
示例

input 
1 1
3 1
3 9
output
68


input 
-10 8
9 100
3 8
output
8825


input 
7 3
3 3
19 3
output
Poor boy

这是我使用的代码:

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


s1 = sqrt(((x1-x2)*(x1-x2))+((y1-y2)*(y1-y2)));
s2 = sqrt(((x2-x3)*(x2-x3))+((y2-y3)*(y2-y3)));
s3 = sqrt(((x1-x3)*(x1-x3))+((y1-y3)*(y1-y3)));
if (s1 > s2 && s1 > s3)
cout<<s1*s1<<endl;
if (s2 > s1 && s2 > s3)
cout<<s2*s2<<endl;
if (s3 > s1 && s3 > s2)
cout <<s3*s3<<endl;
}

else
cout <<"Poor boy";
return 0;


}


首先我找到 slope1 和 slope2 来检查这三个点是否不在同一条线上。所以如果它们不相等,它就会形成一个三角形(绉纱)。使用这个:

slope1 =((y2-y1)/(x2-x1));
slope2 =((y3-y2)/(x3-x2));

然后我用这个公式写了一个求三角形面积的关系:

area = 0.5*abs(((x2-x1)*(y3-y1)-(x3-x1)*(y2-y1)));

最后,我使用 if 语句来判断它是否是三角形,并求出三角形每条边的长度,然后求出最大长度并打印出它的平方。

if (slope1!=slope2 &&  (area)!=0){


s1 = sqrt(((x1-x2)*(x1-x2))+((y1-y2)*(y1-y2)));
s2 = sqrt(((x2-x3)*(x2-x3))+((y2-y3)*(y2-y3)));
s3 = sqrt(((x1-x3)*(x1-x3))+((y1-y3)*(y1-y3)));
if (s1 > s2 && s1 > s3)
cout<<s1*s1<<endl;
if (s2 > s1 && s2 > s3)
cout<<s2*s2<<endl;
if (s3 > s1 && s3 > s2)
cout <<s3*s3<<endl;
}

else
cout <<"Poor boy";
return 0;


}


我在我的编译器中测试了代码,它运行示例中显示的 i/o 非常好。我在 codeforces 上提交了代码,但我不知道为什么在测试 8 中卡住了错误的答案,我的代码运行输入和输出正常。如果你能帮助大家,我会很高兴。

最佳答案

如 Sani 的回答,我建议计算每对点之间的上升和运行:

rise1 = y2 - y1
rise2 = y3 - y2
rise3 = y1 - y3

run1 = x2 - x1
run2 = x3 - x2
run3 = x1 - x3

同样,我建议检查任意两点是否重合。请注意,这等同于 Sani 的代码正在检查的内容:

if (rise1 = run1 = 0) or (rise2 = run2 = 0) or (rise3 = run3 = 0) then
print "Poor Boy"
return 0

现在,与 Sani 类似,我们继续检查点是否在一条线上。但是,我们可以简化条件以进行一些检查。请注意,如果没有两点在一条垂直线上,则如果任意两点之间的斜率相等,则这三个点在一条线上。即,m1 = m2,m2 = m3,或 m3 = m1,等价。我们可以检查是否 m1 = m2。当 rise1/run1 = rise2/run2 时是这样,这是安全的,因为我们假设没有点在垂直线上。我们可以再次安全地将其重新排列为 rise1 * run2 = rise2 * run1。如果没有两点在垂直线上,这是我们唯一需要的检查。

如果两点在一条垂直线上怎么办?那么 run1 和 run2 中至少有一个将为零。但是,因为我们已经保证没有两个点是重合的,所以我们可以绝对确定,如果其中任何一个为零,则相应的上升不为零。还有另外两种情况(除了没有两点在一条垂直线上):

  • 恰好有两点在一条垂直线上。然后 run1 或 run2 为零,但不是两者都为零。不失一般性,假设 run1 为零。然后条件 rise1 * run2 = rise2 * run1 简化为 rise1 * run2 = 0。因为我们知道 rise1 不为零,所以只有当 run2 = 0 时才满足,这与我们的假设情况相矛盾。这意味着,在这种情况下,我们之前得出的条件将产生正确的结果并将这些点识别为不在同一条线上。

  • 三个点在一条垂直线上。那么 run1 和 run2 都为零。然后条件 rise1 * run2 = rise2 * run1 简化为 0 = 0,这始终为真。在这种情况下,条件将产生正确的结果并将三个点识别为在同一条线上。

因为我们针对垂直线上没有两点的情况得出的条件恰好对所有其他可能的情况产生正确的结果,所以我们可以在所有情况下使用它(在没有两点重合的假设下)。因此,我们不需要检查任何东西,除了 rise1 * run2 = rise2 * run1:

if rise1 * run2 = rise2 * run1 then
print "Poor Boy"
return 0

现在我们知道我们有一个三角形,需要返回三个边中最大的一个。我们需要各个坐标的平方差之和。幸运的是,我们已经有了坐标差异,所以:

d1 = (rise1 * rise1) + (run1 * run1)
d2 = (rise2 * rise2) + (run2 * run2)
d3 = (rise3 * rise3) + (run3 * run3)
return max(d1, d2, d3)

关于c++ - 使用三个点(x,y),如何判断它是不是三角形,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47677676/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com