题目链接:FZU 2148 Moon Game
几何体。
判断是不是凹四边形。
如果四边形有一个点在另外三个点组成的三角形内部,这个四边形就是凹四边形,否则就是凸四边形。
凹四边形内部那个点和其余任意两点可以组成三个三角形,这三个三角形面积的和恰好为外部三个点组成的三角形面积,想到这里这题就可以做了。
根据三角形三个点的二维坐标求三角形面积有个公式:abs(p[a].x * p[b].y + p[c].x * p[a].y + p[b].x * p[c].y - p[c].x * p[b].y - p[a].x * p[c].y - p[b].x * p[a].y) * 0.5。
#include <iostream>
#include <cmath>
#include <stdio.h>
using namespace std;
const int MAX_N = 30 + 5;
const double e = 1e-7;
struct Point
{
int x, y;
};
int T, n, cnt, num;
Point p[MAX_N];
double get_area(int a, int b, int c)
{
return abs(p[a].x * p[b].y + p[c].x * p[a].y + p[b].x * p[c].y - p[c].x * p[b].y - p[a].x * p[c].y - p[b].x * p[a].y) * 0.5;
}
bool solve(int i, int j, int k, int m)
{
double sum, a, b, c;
sum = get_area(j, k, m);
a = get_area(i, j, k);
b = get_area(i, j, m);
c = get_area(i, k, m);
if(fabs(sum - a - b - c) < e)
return false;
sum = get_area(i, j, k);
a = get_area(i, j, m);
b = get_area(j, k, m);
c = get_area(i, k, m);
if(fabs(sum - a - b - c) < e)
return false;
sum = get_area(i, k, m);
a = get_area(i, j, k);
b = get_area(i, j, m);
c = get_area(j, k, m);
if(fabs(sum - a - b - c) < e)
return false;
sum = get_area(i, j, m);
a = get_area(i, j, k);
b = get_area(i, k, m);
c = get_area(j, k, m);
if(fabs(sum - a - b - c) < e)
return false;
return true;
}
int main()
{
cin >> T;
num = 0;
while(T--)
{
cin >> n;
cnt = 0;
for(int i = 1; i <= n; i++)
cin >> p[i].x >> p[i].y;
for(int i = 1; i <= n; i++)
{
for(int j = i + 1; j<= n; j++)
{
for(int k = j + 1; k <= n; k++)
{
for(int m = k + 1; m <= n; m++)
{
if(solve(i, j, k, m))
cnt++;
}
}
}
}
printf("Case %d: %d\n", ++num, cnt);
}
return 0;
}
5630

被折叠的 条评论
为什么被折叠?



