hdu 2036 (求多边形面积) 题目:给出n按逆时针排序号的点,求其组成多边形的面积。 #include <iostream> #include <math.h> #include <algorithm> using namespace std; typedef struct node{ double x; double y; }Tpoint; //多边形公式,要求p[]中的点按逆时针排序号 double polygonArea(Tpoint p[],int n) { double area=0; int i; for(int i=1;i<=n;i++) { area+=p[i-1].x*p[i%n].y-p[i-1].y*p[i%n].x ; } return fabs(area/2.0); } int main() { //freopen("input.txt","r",stdin); Tpoint p[105]; int n; while(cin>>n&&n) { for(int i = 0; i<n;i++) { cin>>p[i].x>>p[i].y; } printf("%.1lf/n",polygonArea(p,n)); } return 0; } 若题目中的点不是逆时针排序好的,还需要排序。排序算法如下: //矢量差积 double multiply(Tpoint p1,Tpoint p2,Tpoint p0) { return (p1.x-p0.x)*(p2.y-p0.y)-(p2.x-p0.x)*(p1.y-p0.y); } //两点距离 double dist(Tpoint p1,Tpoint p2) { return sqrt((p1.x-p2.x)*(p1.x-p2.x)+(p1.y-p2.y)*(p1.y-p2.y)); } //p为输入的点集,n为p中的点的数目,按照逆时针方向排列 void sort_anticlockwise(Tpoint p[],int n) { int i,j,k=0; Tpoint tmp; // 选取p中y坐标最小的点p[k],如果这样的点有多个,则取最左边的一个 for(i=1;i<n;i++) if ( p[i].y<p[k].y || (p[i].y==p[k].y) && (p[i].x<p[k].x) ) k=i; tmp=p[0]; p[0]=p[k]; p[k]=tmp; // 现在p中y坐标最小的点在p[0] for (i=1;i<n-1;i++) /* 对顶点按照相对p[0]的极角从小到大进行排序,极角相同的按照距离p[0]从近到远进行排序 */ { k=i; for (j=i+1;j<n;j++) if ( multiply(p[j],p[k],p[0])>0 || // 极角更小 (multiply(p[j],p[k],p[0])==0) && /* 极角相等,距离更短 */ dist(p[0],p[j])<dist(p[0],p[k]) ) k=j; tmp=p[i]; p[i]=p[k]; p[k]=tmp; } }