foj 2148 Moon Game 判断n个点有几个凸四边形 + 枚举4个点 + 判断点在三角形外

题目来源:

http://acm.fzu.edu.cn/problem.php?pid=2148

题意: 判断n个点 可以组成多少个 凸四边形。 

分析: 枚举四个点, 若每个点都在 其他三个点组成的三角形外, 则为 凸四边形, 否则 不是凸四边形。

代码如下:

const int Max_N = 35;
double add(double a, double b){
    return (fabs(a + b) < EPS * (fabs(a) + fabs(b))) ? 0 : ( a+b) ;
}
struct Point{
    double x , y ;
    Point(){}
    Point(double x , double y):x(x),y(y){}
    Point operator - (Point p){
        return Point(add(x ,- p.x) ,add( y ,- p.y)) ;
    }
    double operator^(Point p){
        return add(x * p.y ,- y * p.x) ;
    }
}po[Max_N];
double area(Point a, Point b, Point p){
    return fabs((a - p)^(b - p)) ;
}
//判断一个点po[h], 是否在三个点pp[i , j , k]构成的三角形外,外 ,返回1
int outside_convex(int h, int i, int j, int k){
    double sum = 0 , sums;
    sums = area(po[i] , po[j] , po[k]) ;
    sum += area(po[i] , po[j] , po[h]) ;
    sum += area(po[j] , po[k] , po[h]) ;
    sum += area(po[i] , po[k] , po[h]) ;
    if(sums != sum)
        return 1 ;
    return 0;
}
//判断4个点 是否是凸多边形
bool ok(int h, int i, int j, int k){
    return outside_convex(h , i, j ,k)
           && outside_convex(i , h, j ,k)
           && outside_convex(j , i, h ,k)
           && outside_convex(k , i, j ,h) ;
}
int main(){
    int t , n , i , j , k , h  , tt =1;
    int sum ;
    scanf("%d" , &t) ;
    while(t--){
        sum = 0;
        scanf("%d" , &n) ;
        for(i = 0 ; i < n ; i++){
            scanf("%lf%lf" , &po[i].x , &po[i].y) ;
        }
        for(i = 0 ; i < n -3; i++){  //枚举四个点
            for(j = i+1;  j<n-2 ; j++){
                for(k =j+1 ; k < n-1 ; k++){
                    for(h = k+1 ;  h < n ; h++){
                        if(ok(h, i , j , k)){
                            sum ++ ;
                        }
                    }
                }
            }
        }
        printf("Case %d: %d
" , tt++ , sum ) ;

    }
}
原文地址:https://www.cnblogs.com/zn505119020/p/3711392.html