• 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 ) ;
    
        }
    }
  • 相关阅读:
    本地blast用法
    linux挂载移动硬盘
    酶设计软件rosetta安装
    redhat 6.7 安装nvidia显卡驱动时出现的问题
    分子模拟软件Schrodinger Suites 2015安装
    Python_二维数组
    Python_递归
    Python_装饰器
    Python_生成器generator
    Python_迭代器
  • 原文地址:https://www.cnblogs.com/zn505119020/p/3711392.html
Copyright © 2020-2023  润新知