SGU[151] Construct a triangle
Description
描述
Find coordinates of any triangle ABC if it is know that |AB|=c, |AC|=b, |AM|=m, AM is a median of triangle.
找到任何一个三角形ABC,使得它满足|AB| = c,|AC| = b,|AM| = m,其中AM为三角形的中线。
Input
输入
There are three real numbers in input: c, b, m (0<c,b,m<=10^3) separated by a space. Length of the fractional part of each number is not greater than 2 digits.
输入中包含三个实数:c, b, m (0 < c, b, m <= 10^3),以空格分隔。每个数字的小数部分的长度不超过2位。
Output
输出
If solution exists, write three lines. Write coordinates of point A to first line, coordinates of B to second line and coordinates of C to third line. Separate numbers by a space; absolute value of each coordinate must not exceed 10^4. Write numbers with 5 digits after decimal point. If there is no solution, write "Mission impossible"
如果存在方案,输出三行。第一行为点A的坐标,第二行为点B的坐标,第三行为点C的坐标。数字之间以空格分隔。每个坐标的绝对值不能超过10^4。保留5位小数。如果不存在这样的方案,输出“Mission impossible”。
Sample Input
样例输入
5 5 3
Sample Output
样例输出
0.00000 3.00000
-4.00000 0.00000
4.00000 0.00000
Analysis
分析
解析几何的题目,因为是任意输出一个三角形ABC,为了简化计算,我们不妨令点A为坐标原点,即A(0, 0)。
同时,我们可以令点B在x轴上,即B(c, 0)。
这样,问题就转化成了求解点C的坐标了。根据中学有关解析几何的知识,我们可以得出下面的求解过程:
设C(x, y),则M((x + c) / 2, y / 2)。得方程组:
x^2 + y^2 = b^2 ( 1 )
((x + c) / 2)^2 + (y / 2)^2 = m^2 ( 2 )
将上面两个式子联立,化简即可得到:x = (4 * m^2 - b^2 - c^2) / (2 * c),则y = sqrt(b^2 - x^2)。
接下来要判断是否有解,一种方法是根据上面两个方程推导有解的条件,另一种方法是直接判断y^2是否大于等于0。这里我们采用第二种方法,因为不需要额外推导公式,利用已有的结果就可以得出我们需要的答案。
要特别注意的是,在这里,很可能出现“-0.00000”的情况,对于这种情况,我们需要进行特殊处理。使得它等于0。
Solution
解决方案
#include <iostream> #include <iomanip> #include <math.h> using namespace std; int Check(double x); int main() { double c, b, m; while(cin >> c >> b >> m) { double x = (4 * m * m - b * b - c * c) / (2 * c), y = b * b - x * x; if(Check(y) >= 0) { if(Check(x) == 0) { x = 0; } if(Check(y) == 0) { y = 0; } cout << fixed << setprecision(5) << 0.0 << " " << 0.0 << endl; cout << fixed << setprecision(5) << c << " " << 0.0 << endl; cout << fixed << setprecision(5) << x << " " << sqrt(y) << endl; } else { cout << "Mission impossible" << endl; } } return 0; } int Check(double x) { if(fabs(x) < 1E-9) { return 0; } else { return x > 0 ? 1 : -1; } }
本来在刷小白书的课后习题,但是记到简单的链表和堆栈让我WA了很久,所以就去SGU上找了几道题目刷刷。
做题目的时候一直遇不到AC很容易打击积极性。
这道题目主要在于推到公式,以及注意对于浮点数“-0.00000”这种情况的处理。