题解 P1355 【神秘大三角】

· · 题解

数学

其实这道题还好,只需要各种判断就可以了,但最需要注意的一点就是,精度问题,如果不乘一百的话,最后算出来的结果可能会出错,反正乘上一百也不伤大雅,还有一点就是海伦公式的运用,知三边求面积,这是常用的一个公式,希望大家能记住。

主要思路:把三个顶点和输入的这个点连接,算它的面积,具体情况看代码

#include<bits/stdc++.h>
using namespace std;
int a,b;//每个点的坐标
int c,d;
int e,f;
int x,y;
char alg;//不用在意alg是什么,只是一个符号而已
double hl(int a,int b,int c,int d,int e,int f)//海伦公式求面积,要是感兴趣的可以自行去搜搜推导过程,挺简单的。
{
    double x,y,z,p;
    x=sqrt((a-c)*(a-c)+(b-d)*(b-d));
    y=sqrt((a-e)*(a-e)+(b-f)*(b-f));
    z=sqrt((c-e)*(c-e)+(d-f)*(d-f));
    p=(x+y+z)/2;
    return sqrt(p*(p-x)*(p-y)*(p-z));
}
int main(){
    cin>>alg>>a>>alg>>b>>alg;//繁琐的输入。
    cin>>alg>>c>>alg>>d>>alg;
    cin>>alg>>e>>alg>>f>>alg;
    cin>>alg>>x>>alg>>y>>alg;
    double sum,sum2,sum3,sum4;
    sum=(int)hl(a,b,c,d,e,f)*100;//你懂的,乘一百解决精度问题
    sum2=(int)hl(a,b,c,d,x,y)*100;
    sum3=(int)hl(a,b,e,f,x,y)*100;
    sum4=(int)hl(c,d,e,f,x,y)*100;
    if((a==x&&b==y)||(c==x&&d==y)||(e==x&&f==y)){//如果这个点和其中一个顶点位置重合就输出4.
        cout<<4<<endl;
        return 0;
    }
    if(sum2+sum3+sum4>sum){//如果三个三角形的面积加起来大于原来的三角形就说明这个点在三角形外。
        cout<<2;
        return 0;
    }
    if(sum2==0||sum3==0||sum4==0){//当有一个三角形的面积等于零时,就说明输入的点在其中一个顶点上。
        cout<<3;
        return 0;
    }
    cout<<1;//其他情况都不是的话就是能是1这种情况了。
    return 0;
}