现在的位置: 首页 > 综合 > 正文

ZOJ 1704 Myacm Triangles

2019年04月15日 ⁄ 综合 ⁄ 共 2123字 ⁄ 字号 评论关闭

求三角形内是否包含某点。就枚举四个点,懒得写凸包了。

 

#include <cstdio>
#include 
<string>
#include 
<cmath>
#include 
<algorithm>
using namespace std;

#define _0 1e-10

int N, A, B, C;
typedef 
struct
{
    
double x, y;
    
char ch;
}
 Point;
Point p[
15];

double inline dabs ( double d )
{
    
return d < _0 ? -d : d;
}


int cmp ( Point &a, Point &b )
{
    
if ( a.y == b.y )
        
return a.x < b.x;
    
return a.y < b.y;
}


int bCmp ( Point &a, Point &b, Point &c )
{
    
//if ac is longer than ab
    double del = ( c.x - a.x ) * ( c.x - b.x ) + ( c.y - a.y ) * ( c.y - b.y );
    
if ( del > _0 )
        
return 1;
    
if ( del < -_0 )
        
return -1;
    
return 0;
}


int crossDet ( Point &a, Point &b, Point &c )
{
    
//if ac is on left side of ab
    double del = ( b.x - a.x ) * ( c.y - a.y ) - ( c.x - a.x ) * ( b.y - a.y );
    
if ( del > _0 )
        
return 1;
    
if ( del < -_0 )
        
return -1;
    
if ( bCmp ( a, b, c ) <= 0 )
        
return 0;
    
return 2;
}


int inArea ( int a, int b, int c, int d )
{
    
int x1 = crossDet ( p[a], p[b], p[d] );
    
int x2 = crossDet ( p[b], p[c], p[d] );
    
int x3 = crossDet ( p[c], p[a], p[d] );
    
if ( !x1 || !x2 || !x3 )
        
return 1;
    
if ( x1 == x2 && x2 == x3 )
        
return 1;
    
return 0;
}


double calc ( int a, int b, int c )
{
    
double area = dabs ( 0.5 * ( ( p[c].y - p[a].y ) * ( p[b].x - p[a].x ) - ( p[b].y - p[a].y ) * ( p[c].x - p[a].x ) ) ); 
    
int d;
    
for ( d = 0; d < N; d ++ )
    
{
        
if ( d == a || d == b || d == c )
            
continue;    
        
if ( inArea ( a, b, c, d ) )
            
return 0.00;
    }

    
return area;
}


int main ()
{
    
//freopen ( "in.txt", "r", stdin );
    while ( scanf ( "%d "&N ) && N )
    
{
        
int i;
        
for ( i = 0; i < N; i ++ )
            scanf ( 
"%c %lf %lf "&p[i].ch, &p[i].x, &p[i].y );
        
int a, b, c;
        
double t, ans = -1;
        
for ( a = 0; a < N; a ++ )
            
for ( b = a + 1; b < N; b ++ )
                
for ( c = b + 1; c < N; c ++ )
                    
if ( ( t = calc ( a, b, c ) ) > ans )
                        ans 
= t, A = p[a].ch, B = p[b].ch, C = p[c].ch;
        printf ( 
"%c%c%c ", A, B, C );
    }

    
return 0;
}
【上篇】
【下篇】

抱歉!评论已关闭.