• 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”这种情况的处理。

  • 相关阅读:
    2.11 Go接口内部实现
    2.08 Go之类型分支(switch判断空接口中变量的类型)
    2.08 Go之使用空接口实现保存任意值的字典
    2.07 Go之接口和类型之间的转换
    1.28 Go之接口的嵌套组合
    2.11 Go之error接口
    libpng.md
    5_中间件.md
    8_多服务运行.md
    6_模板与渲染.md
  • 原文地址:https://www.cnblogs.com/Ivy-End/p/4297413.html
Copyright © 2020-2023  润新知