UVA378题解报告

· · 题解

注:

本题解使用的全部是一次函数知识。

前置知识

直接看这个吧:一道很水的紫题。

解法

先特判直线两点横坐标相等的情况,此时无法计算出斜率的值。

然后,计算出两直线的解析式,直接联立求解即可。

然后就做完了。具体细节见代码:

#include<cstdio>
using namespace std;

int main()
{
    int n;
    scanf("%d",&n);
    printf("INTERSECTING LINES OUTPUT\n");
    while(n--)
    {
        double x1,y1,x2,y2,x3,y3,x4,y4,k1,k2,b1,b2,judge=1e-13;//double可精确到小数点后15位
        scanf("%lf%lf%lf%lf%lf%lf%lf%lf",&x1,&y1,&x2,&y2,&x3,&y3,&x4,&y4);
        if(x1==x2&&x3!=x4)
        {
            k2=(y3-y4)/(x3-x4),b2=y3-k2*x3;
            double x=x1,y=k2*x+b2;
            printf("POINT %.2lf %.2lf\n",x,y);
        }
        else if(x1!=x2&&x3==x4)
        {
            k1=(y1-y2)/(x1-x2),b1=y1-k1*x1;
            double x=x3,y=k1*x+b1;
            printf("POINT %.2lf %.2lf\n",x,y);
        }
        else if(x1==x2&&x3==x4)
        {
            if(x1==x3) printf("LINE\n");
            else printf("NONE\n");
        }//先进行三次特判
        else
        {
            k1=(y1-y2)/(x1-x2),b1=y1-k1*x1;
            k2=(y3-y4)/(x3-x4),b2=y3-k2*x3;
            if(b1-b2<=judge&&b1-b2>=-judge&&k1-k2<=judge&&k1-k2>=-judge) printf("LINE\n");
            else if(k1-k2<=judge&&k1-k2>=-judge) printf("NONE\n");
            else{
                double x=(b1-b2)/(k2-k1),y=(b2*k1-b1*k2)/(k1-k2);//联立求解,推导过程较为简单,这里就不证了
                printf("POINT %.2lf %.2lf\n",x,y);
            }
        }
    }
    printf("END OF OUTPUT\n");
    return 0;
}