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\n",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\n",cs++,cnt);

    }

    return 0;

}
View Code

 

你可能感兴趣的:(game)