http://www.acm.cs.ecnu.edu.cn/problem.php?problemid=1990

   题目的意思是求出一些点,使得这些点到给定的一些直线的距离相等,只有一个点的时候输出该点,多个点那么输出"Many",没有符合的点那么输出"None",大致的做法是:先用角平分线求出一定量的点(最多4个),然后枚举检查这些点,精度有点搞!!!

#include < iostream >  
#include
< complex >
#include
< cmath >
#include
< algorithm >
using   namespace  std;
typedef complex
< double >  point;

const   double  eps  =  1e - 8 ;
const   double  inf  =  1e20;
const   double  pi  =  acos(  - 1.0  );
const   int  maxn  =   103 ;
struct  line
{
    point a, b;
    line( )
{ }
    line( point u, point v ) : a( u ), b( v ) 
{  }
}
;
line L[maxn];
bool  vis[maxn];

int  dblcmp(  double  x ) return ( x < -eps ? -1 : x > eps ); }
double   operator ^ ( point p1, point p2 ) return imag( conj( p1 ) * p2 ); }    //  叉积
double   operator & ( point p1, point p2 ) return real( conj( p1 ) * p2 ); }    //  点积
//  两直线交点,求交点之前先判断是否平行
point  operator * ( line u, line v )
{
    
double t = v.a - u.a ^ v.b - u.a;
    
double s = v.b - u.b ^ v.a - u.b;
    
return u.a + ( u.b - u.a ) * t / ( t + s );
}

//  点到直线的距离
double  DisPointToLine( point p, line l ) return fabs( l.a - p ^ l.b - p ) / abs( l.a - l.b ); }
//  判断两直线平行
bool  LineParallel( line u, line v )  return dblcmp( ( u.a - u.b ^ v.a - v.b ) ) == 0; }
//  直线向左侧平移 
line Translation( line l )
{
    point p 
= ( l.b - l.a ) * point( 0.01000.0 / abs( l.b - l.a ) );
    
return line( l.a + p, l.b + p );
}

//  以l.a为原点,逆时针旋转90度 
line Rotation( line l )
{
    point p 
= ( l.b - l.a ) * point( 0.01.0 );
    
return line( l.a, l.a + p );
}

//  求 u 与 v 的一条角平分线
line GetLine( line u, line v )
{
    line l1 
= Translation( u );
    line l2 
= Translation( v );
    
return line( u * v, l1 * l2 );
}


bool  check( point p,  int  n,  double  val )
{
    
int i;
    
double D;
    
for( i = 0; i < n; i++ )
    
{
        D 
= DisPointToLine( p, L[i] );
        
if( dblcmp( D - val ) != 0 )return false;
    }

    
return true;
}


bool  same_point( point p1, point p2 )
{
    
return dblcmp( imag( p1 ) - imag( p2 ) ) == 0 && dblcmp( real( p1 ) - real( p2 ) ) == 0;
}


int  MyUnique( point p[],  int  n )
{
    
int i, len = 1;
    
for( i = 1; i < n; i++ )
    
{
        
if!same_point( p[i], p[i-1] ) )
            p[len
++= p[i];
    }

    
return len;
}


void  solve(  int  n )
{
    
if( n < 3 ){ printf("Many\n"); return; }
    
int i, j;
    line l[
4], u, v, w;
    memset( vis, 
falsesizeof( vis ) );
    vis[
0= true;
    u 
= L[0];
    
for( i = 1; i < n; i++ )
    
{
        
if!LineParallel( L[0], L[i] ) )
        
{
            vis[i] 
= true;
            v 
= L[i];
            
break;
        }

    }

    
if( i == n ){ printf("None\n"); return; }
    l[
0= GetLine( u, v );
    l[
1= Rotation( l[0] );
    
for( i = 1; i < n; i++ )
    
{
        
if!vis[i] && ( !LineParallel( u, L[i] ) || !LineParallel( v, L[i] ) ) )
        
{
            vis[i] 
= true;
            w 
= L[i];
            
break;
        }

    }

    
if!LineParallel( u, w ) )
    
{
        l[
2= GetLine( u, w );
        l[
3= Rotation( l[2] );
    }

    
else 
    
{
        l[
2= GetLine( v, w );
        l[
3= Rotation( l[2] );
    }

    point p[
4];
    
double val[4];
    
int len = 0;
    
if!LineParallel( l[0], l[2] ) ) { p[len] = l[0* l[2]; val[len++= DisPointToLine( p[len], u ); }
    
if!LineParallel( l[0], l[3] ) ) { p[len] = l[0* l[3]; val[len++= DisPointToLine( p[len], u ); }
    
if!LineParallel( l[1], l[2] ) ) { p[len] = l[1* l[2]; val[len++= DisPointToLine( p[len], u ); }
    
if!LineParallel( l[1], l[3] ) ) { p[len] = l[1* l[3]; val[len++= DisPointToLine( p[len], u ); }
    len 
= MyUnique( p, len );
    
int cnt = 0;
    point P;
    
for( i = 0; i < len; i++ )
    
{
        
if( check( p[i], n, val[i] ) )
        
{
            P 
= p[i];
            cnt
++;
        }

    }

    
if( cnt == 0 )printf("None\n");
    
else if( cnt == 1 )printf("%.5lf %.5lf\n",P.real( ), P.imag( ) );
    
else printf("Many\n");
}


int  main( )
{
    
int i, n;
    
double x1, x2, y1, y2;
    
while( scanf("%d",&n) != EOF )
    
{
        
for( i = 0; i < n; i++ )
        
{
            scanf(
"%lf%lf%lf%lf",&x1,&y1,&x2,&y2);
            L[i] 
= line( point( x1, y1 ), point( x2, y2 ) );
        }

        solve( n );
    }

    
return 0;
}