题意
在一个平面中,给你N个点的坐标,请计算出一共能组成多少个凸四边形(convex quadrilateral)。
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
首先,要知道定义:
凸:所有内角都小于180度的多边形
凹:至少有一个内角大于180度的多边形
我们可以根据凸、凹边形具有的一些”可计算性“的性质进行区分,比如:四边形中任意三个点组成的四个三角线面积
①如果存在某两个面积等于另两个面积之和,则为凸,否则一定是凹
②最大的面积如果等于另三个面积和,则为凹,否则一定是凸
这样,只要遍历平面中所有点的组合,再利用上述某个性质区分凹凸,就能计算出总共有几个凸边形。
#include
#include
using namespace std;
int x[30], y[30];
double area3(int p1, int p2, int p3)
{
double s = 0;
// 使用任意多边形面积计算公式
s += x[p1]*y[p2]- y[p1]*x[p2];
s += x[p2]*y[p3]- y[p2]*x[p3];
s += x[p3]*y[p1]- y[p3]*x[p1];
return s>0?s/2.0:-s/2.0; // 这题这里不除2也不会错
}
int main()
{
int t, T;
scanf("%d", &T);
for (t = 1; t <= T; t++)
{
int N, sum = 0;
scanf("%d", &N);
for (int i = 0; i < N; i++)
scanf("%d%d", &x[i], &y[i]);
int i, j, k, l;
double s[4];
for (i = 0; i < N-3; i++)
{
for (j = i+1; j < N-2; j++)
{
for (k = j+1; k < N-1; k++)
{
for (l = k+1; l < N; l++)
{
s[0] = area3(j, k, l); // remove i
s[1] = area3(i, k, l); // remove j
s[2] = area3(i, j, l); // remove k
s[3] = area3(i, j, k); // remove l
sort(s, s+4);
sum += (s[3] != s[0] + s[1] + s[2]);
}
}
}
}
printf("Case %d: %d\n", t, sum);
}
return 0;
}