wa wa %>_<%
程序代码:
#include<stdio.h> int main() { int x1,x2,x3,x4,y1,y2,y3,y4,temp,ok; double k1,k2,s; while(scanf("%d%d%d%d%d%d%d%d",&x1,&y1,&x2,&y2,&x3,&y3,&x4,&y4)!=EOF) { ok=0; if(x1>x2) {temp=x1;x1=x2;x2=temp;temp=y1;y1=y2;y2=temp;} if(x3>x4) {temp=x3;x3=x4;x4=temp;temp=y3;y3=y4;y4=temp;} if(x1==x2&&x3==x4) { if(x1!=x3) ok=0; else { if((y3>=y1&&y3<=y2)||(y3>=y2&&y3<=y1)) ok=1; if((y4>=y1&&y4<=y2)||(y4>=y2&&y4<=y1)) ok=1; } } if((x1==x2&&x3!=x4)||(x1!=x2&&x3==x4)) { if(x3==x4) { temp=x1;x1=x3;x3=temp;temp=y1;y1=y3;y3=temp; temp=x2;x2=x4;x4=temp;temp=y2;y2=y4;y4=temp; } if(x3<=x1&&x4>=x1) { s=(y3-y4)/(x3-x4)*(x1-x3)+y3; if((s>=y1&&s<=y2)||(s>=y2&&s<=y1)) ok=1; } } if(x1!=x2&&x3!=x4) if((y1-y2)*(x3-x4)==(y3-y4)*(x1-x2)) if((x1*y2-x2*y1)*(x3-x4)==(x3*y4-x4*y3)*(x1-x2)) if((x3>=x1&&x3<=x2)||(x4>=x1&&x4<=x2)) ok=1; else ok=0; else ok=0; else { k1=(x3*y4-x4*y3)*(x1-x2)-(x1*y2-x2*y1)*(x3-x4); k2=(y1-y2)*(x3-x4)-(y3-y4)*(x1-x2); s=k1/k2; if((s>=x1&&s<=x2)&&(s>=x3&&s<=x4)) ok=1; } if(ok) printf("YES\n"); else printf("NO\n"); } return 0; }
题目是:
Description
最近在学习数论和一些数学的几何分析,偶然想到这么个问题。 在计算几何学里,线段直线是我们所熟悉的。 我们在学几何的时候都知道如何判断两直线是否相交,判断两线段是否相交。 那么,在算法里如何实现呢? 为了确定给定的两个平面线段是否相交,请设计一个算法,实现判断线段是否相交。
Input
数据输入有多组数据 每组数据包含两行,每行为一条线段的两个端点的平面坐标,格式为x1 y1 x2 y2,且它们都为整数。
Output
如果线段相交 输出YES 否则 输出NO。
Sample Input
0 0 1 1
0 -1 1 0
0 0 1 1
0 1 1 0
Sample Output
NO
YES