zoukankan      html  css  js  c++  java
  • 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 ) ;
    
        }
    }
  • 相关阅读:
    设计模式开篇——7大设计原则
    MySQL MVCC专题
    Spring常考的面试题
    HashMap常考面试题
    Equals和==的比较
    高并发编程
    一文读懂JVM
    scala实现定时任务的方法
    PLAY2.6-SCALA(十二) 表单的处理
    PLAY2.6-SCALA(十一) 模板常用场景
  • 原文地址:https://www.cnblogs.com/zn505119020/p/3711392.html
Copyright © 2011-2022 走看看