//十分恶心的浮点运算,极度恶心的16个WA。。。 //输入一大堆线段,输出可以合并成几条 //排个序就OK,但是很容易在精度那边WA /*先保证x1<x2 斜率不存在的时候保证y1<y2 排序思路: 保证能划一起的线段一定邻居,不难但是精度要注意呀 *///之后遍历一次合并就可以了 //浮点数判断相等只要距离在某个很小的数就true了 //还有就是浮点数取正要用fabs(),WA在这里很久很久。。 //wengsht #include <iostream> #include <cstdio> #include <algorithm> #include <cmath> using namespace std; int n,result; const double mn = 1e-8; struct Seg { bool no_k; //无斜率 double x1,y1,x2,y2,k,y0; //斜率k 与y轴交点y0 }seg[10010]; inline double _max( double a,double b ) { return a>b?a:b; } inline void _swap( double &a,double &b ) { double temp = a; a = b;b = temp ; } bool equal( double a,double b ) { return fabs(a-b) < mn; } bool _cmp( Seg seg1,Seg seg2 ) { if( seg1.no_k && seg2.no_k ) { if( !equal( seg1.x1,seg2.x1 ) ) return seg1.x1 < seg2.x1; return seg1.y1 < seg2.y1; } if( seg1.no_k ) return false; if( seg2.no_k ) return true; if( !equal( seg1.k,seg2.k ) ) return seg1.k < seg2.k; if( !equal( seg1.y0,seg2.y0 ) ) return seg1.y0 < seg2.y0; return seg1.x1 < seg2.x1; } int main() { //freopen("1.txt","r",stdin); while( scanf("%d",&n) && 0 != n ) { for( int i = 0;i < n;i++ ) { scanf("%lf%lf%lf%lf",&seg[i].x1,&seg[i].y1,&seg[i].x2,&seg[i].y2); if( seg[i].x2 < seg[i].x1 ) { _swap(seg[i].y1,seg[i].y2); _swap(seg[i].x1,seg[i].x2); } if( equal(seg[i].x2,seg[i].x1) && seg[i].y2 < seg[i].y1 ) { _swap(seg[i].y1,seg[i].y2); _swap(seg[i].x1,seg[i].x2); } if( equal( seg[i].x1,seg[i].x2 ) ) seg[i].no_k = 1; else { seg[i].k = (seg[i].y2-seg[i].y1)/(seg[i].x2-seg[i].x1); seg[i].no_k = 0; seg[i].y0 = seg[i].y1-seg[i].k*seg[i].x1; } } sort( seg,seg+n,_cmp ); result = n; for( int i = 1;i < n;i++ ) { if( seg[i].no_k && seg[i-1].no_k && equal( seg[i].x1,seg[i-1].x1 ) ) { if( seg[i-1].y2 > seg[i].y1 || equal( seg[i-1].y2,seg[i].y1 ) ) { seg[i].y2 = _max(seg[i].y2,seg[i-1].y2); result--; } } else if( seg[i].no_k || seg[i-1].no_k ) continue; else if( equal( seg[i].k,seg[i-1].k ) && equal( seg[i].y0,seg[i-1].y0 ) ) { if( seg[i-1].x2 > seg[i].x1 || equal( seg[i-1].x2,seg[i].x1 ) ) { seg[i].x2 = _max(seg[i].x2,seg[i-1].x2); result--; } } } printf("%d/n",result); } return 0; }