1. 程式人生 > >hdu4709 herding 計算幾何 三角形面積 列舉

hdu4709 herding 計算幾何 三角形面積 列舉

題目給出了n個點,求任意幾個點能圍成的最小圖形的面積。看到題的開始在圖形的形狀上猶豫了一上,忽然想到一定是三角形,因為多邊形必然可繼續切割成三角形。於是轉換成了列舉三點,判斷面積。注意共線情況。

本次用到了運算子過載

#include<cmath>
#include<iostream>
#include<cstdio>
#define MAXN 1005
using namespace std;
typedef struct node{
	double x, y;
}dots;
dots coor[MAXN];
double operator *(dots p, dots q){
	return (p.x*q.y-q.x*p.y)/2;
}
dots operator -(dots p, dots q){
	dots tmp;
	tmp.x=p.x-q.x;
	tmp.y=p.y-q.y;
	return tmp;
}
double esp=1e-8;
int main(){
	int ncase;
	cin>>ncase;
	while(ncase--){
		int n;cin>>n;
		for(int i=0;i<n;i++){
			scanf("%lf%lf", &coor[i].x, &coor[i].y);
		}
		double ans=-1;
		dots ad, bd;
		for(int i=0;i<n;i++){
			for(int j=i+1;j<n;j++){
				for(int k=j+1;k<n;k++){
					ad=coor[j]-coor[i];bd=coor[k]-coor[i];
					double tmp=fabs(ad*bd);
					if(tmp-0<=esp)continue;
					if(ans==-1)ans=tmp;
					else if(tmp<ans)ans=tmp;
				}
			}
		}
		if(ans==-1)cout<<"Impossible"<<endl;
		else printf("%.2lf\n", ans);
	}
	return 0;
}