zoj1820 Intersecting Lines

 http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=1280

题目是讲两个点确定一条直线,那么给你两组,就是两条直线,请你说明这是平行还是覆盖还是相交,如果相交那么给出焦点。就是那么简单,简单的数学运算。需要注意的是有些人喜欢用斜率,但是直线可以出现平行于y轴的,也就是斜率无限大,需要注意。我是用分数表示斜率的,所以避免了这个问题。还有平行的判断可以使用叉乘,不要比较斜率,这样可以避免斜率不存在的判断,代码可以简单点。总的来讲就是斜率不存在这个比较讨厌,其他没有问题。上代码:

#include<stdio.h> struct point { int x; int y; }p[5]; int main() { int N; printf("INTERSECTING LINES OUTPUT/n"); scanf("%d",&N); while(N--) { for(int i=1;i<=4;i++) { scanf("%d %d",&p[i].x,&p[i].y); } if(((p[1].y-p[2].y)*(p[3].x-p[4].x)-(p[3].y-p[4].y)*(p[1].x-p[2].x))==0) { if(((p[1].y-p[2].y)*(p[2].x-p[4].x)-(p[2].y-p[4].y)*(p[1].x-p[2].x))==0) printf("LINE/n"); else printf("NONE/n"); } else { float b = p[1].y-p[2].y; float a = p[1].x-p[2].x; float d = p[3].y-p[4].y; float c = p[3].x-p[4].x; float x = (a*c*(p[3].y-p[1].y)+c*b*p[1].x-a*d*p[3].x)/(c*b-a*d); float y; if(a!=0) y = p[1].y+(b/a)*(x-p[1].x); else y = p[3].y+(d/c)*(x-p[3].x); printf("POINT %.2f %.2f/n",x,y); } } printf("END OF OUTPUT/n"); }

你可能感兴趣的:(c,float)