这个题本身也确实比较简单,题目说求最小面积,要面积最小的话,自然是三角形。所以问题就转化在已知点中,求最小的三角形面积。
计算三角形面积,可以用海伦公式,也可以使用叉乘。我在这里使用的是叉乘。
做题的过程中,我也是遇到了两个问题。一个是在点的定义上用float的话会WA。所以还是使用double 来定义点。另外就是一定要判断三个点是否能够构成三角形。
下面是AC代码:
#include <cstdio>
#include <cmath>
#include <iostream>
using namespace std;
#define fn(i,n) for(int i = 0; i < n; i++)
const double EPS = 1e-8;
const int INF = 0x3f3f3f3f;
struct piont
{
double x, y;
} p[111];
double area(piont a,piont b,piont c)
{
return fabs((b.x - a.x) * (c.y - a.y) - (c.x - a.x) * (b.y - a.y))/2.0;
}
int main()
{
int T;
cin >> T;
while(T--)
{
int n , sign = 1;
double ans = INF;
cin >> n;
fn(i,n) cin >> p[i].x >> p[i].y;
for(int i = 0; i < n - 2; i++)
for(int j = i + 1; j < n - 1; j++)
for(int k = j + 1; k < n; k++)
{
double tmp;
tmp = area(p[i],p[j],p[k]);
if((tmp < ans)&&(tmp > EPS)) {
sign = 0;
ans = tmp;
}
}
if(sign)cout << "Impossible" << endl;
else printf("%.2f\n", ans);
}
return 0;
}