1. 程式人生 > >江西理工18年校賽D四邊形面積(OJ題目ACM)

江西理工18年校賽D四邊形面積(OJ題目ACM)

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)//才是判斷是不是凹四邊形的依據