江西理工18年校賽D四邊形面積(OJ題目ACM)
阿新 • • 發佈:2018-12-07
D: 四邊形面積
題目描述
有一個四邊形,現在需要求它的面積
輸入
輸入四行,每行兩個數整數xx, yy (1≤x,y≤1000)(1≤x,y≤1000),四個點是按逆時針輸入的。
輸出
輸出四邊形的面積,保留3位小數點
樣例輸入
0 0
10 0
1 1
0 11
樣例輸出
10.500
樣例輸入
0 0
1000 0
1000 1000
0 1000
樣例輸出
1000000.000
提示
C語言中保留3位小數用%.3lf 用法:printf("%.3lf",result)
四邊形分凸凹四邊形。
思考
正常四邊形面積ABC+ACD或者ABD+BCD是一樣的,是固定的
凹四邊形面積兩種可能ABC+ACD或ABD+BCD,且面積是更小的那個
#include<stdio.h> #include<stdlib.h> #include<math.h> typedef struct { int x; int y; } Point; /*兩點之間的直線距離*/ double length(Point *A,Point *B) { return sqrt(pow(A->x-B->x,2)+pow(A->y-B->y,2)); } double area_of_triangle(Point A,Point B,Point C) { double area,a,b,c,p; a=length(&B,&C); b=length(&C,&A); c=length(&A,&B); p=(a+b+c)/2; area=sqrt(p*(p-a)*(p-b)*(p-c)); return area; } #define a P[0] #define b P[1] #define c P[2] #define d P[3] int main() { char pname[]="ABCD",*p=pname; Point m,n,r,P[4],*PP=P; double abcd,rmn,abcd1; while(*p) { //printf("input (x,y) of point %c:",*p); scanf("%d%d",&PP->x,&PP->y); p++; PP++; } /*至此得到四邊形的4個頂點的座標*/ /*這裡計算四邊形ABCD的面積*/ double abc=area_of_triangle(a,b,c); double adc=area_of_triangle(a,d,c); double abd=area_of_triangle(a,b,d); double bdc=area_of_triangle(b,d,c); abcd =abc+adc; //補充檢測四邊形,看它的凹凸性 abcd1=abd+bdc; if(abcd1<abcd)//肯定是凹四邊形 printf("%.3lf",abcd1); else printf("%.3lf",abcd); }
實際上if(abcd1!=abcd)//才是判斷是不是凹四邊形的依據