zoukankan      html  css  js  c++  java
  • FZU 2148 Moon Game --判凹包

    题意:给一些点,问这些点能够构成多少个凸四边形

    做法:

    1.直接判凸包

    2.逆向思维,判凹包,不是凹包就是凸包了

    怎样的四边形才是凹四边形呢?凹四边形总有一点在三个顶点的内部,假如顶点为A,B,C,D,则构成四个三角形:ABC,ACD,ABD,BCD,假如某一个三角形(最外的三个顶点)的面积等于另三个三角形面积之和,则是凹四边形。

    然后做四个for循环,枚举即可,因为N最多才30.

    代码:

    #include <iostream>
    #include <cstdio>
    #include <cstring>
    #include <cmath>
    #include <cstdlib>
    #include <algorithm>
    using namespace std;
    #define N 1007
    #define M 33
    
    struct Point
    {
        double x,y;
    }p[34];
    
    double calc_area(Point a,Point b,Point c)  //叉积求三角形面积
    {
        return fabs(a.x*b.y + c.x*a.y + b.x*c.y - c.x*b.y - a.x*c.y - b.x*a.y)*0.5;
    }
    
    int main()
    {
        int t,i,n;
        int j,k,h;
        int cs = 1;
        scanf("%d",&t);
        while(t--)
        {
            scanf("%d",&n);
            for(i=0;i<n;i++)
                scanf("%lf%lf",&p[i].x,&p[i].y);
            int cnt = 0;
            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++)
                        {
                            double Area1 = calc_area(p[i],p[j],p[k]);
                            double Area2 = calc_area(p[i],p[j],p[h]);
                            double Area3 = calc_area(p[j],p[k],p[h]);
                            double Area4 = calc_area(p[i],p[k],p[h]);
                            //printf("%lf %lf %lf %lf
    ",Area1,Area2,Area3,Area4);
                            if(fabs(Area1-Area2-Area3-Area4) < eps)
                                continue;
                            if(fabs(Area2-Area3-Area4-Area1) < eps)
                                continue;
                            if(fabs(Area3-Area1-Area2-Area4) < eps)
                                continue;
                            if(fabs(Area4-Area1-Area2-Area3) < eps)
                                continue;
                            cnt++;
                        }
                    }
                }
            }
            printf("Case %d: %d
    ",cs++,cnt);
        }
        return 0;
    }
    View Code
  • 相关阅读:
    BZOJ 1003 物流运输
    549565
    26566
    68
    554554
    5656
    49886
    5989
    6898
    656
  • 原文地址:https://www.cnblogs.com/whatbeg/p/3843802.html
Copyright © 2011-2022 走看看