Hdu1071 *完全就是考高数嘛*

来源:互联网 发布:win10系统适合编程吗 编辑:程序博客网 时间:2024/05/17 10:08
#include <iostream>
#include <cmath>
#include <iomanip>


using namespace std;


typedef struct {
    double x;
    double y;
} point;


double distance(point line1, point line2, point x)
{
    //x 到line的距离
    double a = (line1.y - line2.y)/(line1.x - line2.x);
    double b = line1.y - a * line1.x;
    return abs(a*x.x - x.y + b)/sqrt(a*a + 1);
}


double eare(point x, point y, point z, double a, double b, double c)
{
    //a, b, c是二次方程参数
    double temp = distance(x, y, z);
    if (temp < 0.0001) {
        //返回满足条件的三角形的面积
        return sqrt((x.x - y.x)*(x.x - y.x) + (x.y - y.y)*(x.y - y.y)) / 2 * temp;
    } else {
        point e1, e2;
        e1.x = (x.x + z.x) / 2;
        e1.y = a*e1.x*e1.x + b*e1.x + c;
        e2.x = (y.x + z.x) / 2;
        e2.y = a*e2.x*e2.x + b*e2.x + c;
        //返回大三角和两个小三角的面积之和
        return eare(x, z, e1, a, b, c) + eare(y, z, e2, a, b, c) + sqrt((x.x - y.x)*(x.x - y.x) + (x.y - y.y)*(x.y - y.y)) / 2 * temp;
    }
}


int main(int argc, char *argv[])
{
    int N;
    cin >> N;
    point x, y, z;
    while (N--) {
        //有顺序要求,如题目的输入顺序
        cin >> z.x >> z.y >> x.x >> x.y >> y.x >> y.y;


        double a, b, c;
        //y = a*x^2 + b*x + c; 方程参数
        a = (z.y - x.y - (z.x - x.x)*(y.y - x.y)/(y.x - x.x)) /
            ((z.x*z.x - x.x*x.x) - (z.x - x.x)*(y.x + x.x));
        b = (y.y - x.y - (y.x*y.x - x.x*x.x) * a) / (y.x - x.x);
        c = x.y - a*x.x*x.x - b*x.x;
        //精度和输出控制
        cout << setiosflags(ios::fixed);
        cout << setprecision(2) <<eare(x, y, z, a, b, c) << endl;
    }


    return 0;
}
原创粉丝点击