- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我在 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/
判断置顶文章 is_sticky() 函数用来判断一篇文章是否为置顶文章。 用法 ?
判断结构要求程序员指定一个或多个要评估或测试的条件,以及条件为真时要执行的语句(必需的)和条件为假时要执行的语句(可选的)。 下面是大多数编程语言中典型的判断结构的一般形式: 判断语句 C
我经常这样写: (if (nil? a-value) another-value a-value) 是否有更简单的功能可用,例如: (if-nil? a-value another-value) 最佳
MySQL IF 语句允许您根据表达式的某个条件或值结果来执行一组 SQL 语句。 要在 MySQL 中形成一个表达式,可以结合文字,变量,运算符,甚至函数来组合。表达式可以返回 TRUE,FA
也就是说,是否有一种工具可以自动显示给定语法的完整语言,包括突出歧义(如果有)? 最佳答案 BNF 风格的文法可能有一些特殊性,但总的来说,确定给定的上下文无关文法(例如 BNF)是否有歧义是不可能的
有没有办法确定像下面这样的 Axios 请求是否收到了答案并完成了? axios.get('/api') .then(response => this.data = response.data); 最
我想请大家禁用 Firebug 。如何确定自己安装了firebug?所以它是一个跨浏览器,并在 Chrome、Mozilla 和 IE8 + 中确定 最佳答案 两步: 如果 window.consol
我有一个看起来像这样的对象: var searchFilter = {_id: XXX, approved: true} 用于驱动 Meteor 集合搜索过滤器。然后,我有一对文本框,允许用户输入一系
我正在循环并向我的数据库中插入几百万条记录。性能是第一要务。 我想利用无状态 session ,但您可能知道它们不支持在更复杂的实体上级联对象。 是否有一种通用方法可以确定实体是否具有级联记录?如果是
我正在使用 pdfminer 解析一些 PDF 文件。图书馆。 我需要知道文档是否是扫描文档,扫描机将扫描图像放在顶部,将 OCR 提取的文本放在背景中。 有没有办法识别文本是否可见,因为 OCR 机
我正在寻找一种方法来找出当前为浏览器游戏 TribalWars 编写的脚本打开的页面。 URL 的设置非常相似,对于知道自己在做什么的人来说这应该很容易(我显然不知道)。 URL 如下所示: http
我在 C# 中使用包装的 C 库,需要将图像从该库转换为位图并返回,但没有复制像素缓冲区。 转换为位图很简单: Bitmap WrapAsBitmap(CImage image) { retu
有没有办法检查调用方法的Controller是否来自Area内的Controller? 例如,我有一个继承自 AuthorizeAttribute 的类,例如 public class CustomA
是否可以找到MySQL View 中某列所属的表名? 如果 View 构造为 CREATE VIEW alpha_view AS SELECT alpha.col1, alpha.col2,
如何判断 .Net 应用程序是作为桌面应用程序运行还是作为服务运行? 我们正在尝试使用 Fitnesse 测试我们的应用程序,它将应用程序作为服务加载,然后调用它。但是当一个模式错误框被按下时,它就会
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 要求提供代码的问题必须表现出对所解决问题的最低限度理解。包括尝试过的解决方案、为什么它们不起作用,以及
我试图计算出 iframe 内容的大小,以便调整 iframe 元素的大小以包含其内容。 如何确定 iFrame 是否已加载以及我是否可以可靠地测量它的内容尺寸。 注意:onload 事件不会执行,因
这个问题在这里已经有了答案: How to write portable code in c++? (12 个答案) 关闭 9 年前。 我正在尝试编写可以用任何现代版本的 g++ 编译的代码,但遇到
这个问题在这里已经有了答案: distinguish shared objects from position independent executables (2 个答案) 关闭 4 年前。 我有
我的目标是如果 dte 与当前时间相差不到 1 小时,则停止循环。是否有“ ruby 方式”来做到这一点? #THIS IS AN INFINITE LOOP, DONT RUN THIS dte=D
我是一名优秀的程序员,十分优秀!