已知四边形是条边求四边形最大面积

有四根木棍,长度分别为 a b c d ,求着四根木棍组成四边形的最大面积。

输入格式

第一行包含一个整数 Ca ( Ca ≤ 10000 ) ,表示有 Ca 组测试数据,对于每组测试数据:

输入包含一行,该行包含四个整数 a b c d ( 1 ≤ a , b , c , d ≤ 1000 ) 。

输出格式

对于每组测试数据,输出 "Case c: ans" ,其中 c 表示测试数据编号, ans 表示最大的面积,小数点后保留六位,如果不能组成四边形,则 ans 处输出 -1 。

样例输入

3
1 2 4 8
2 3 4 5
6 3 2 5

样例输出

Case 1: -1
Case 2: 10.954451
Case 3: 13.416408

#include <bits/stdc++.h>
using namespace std;
bool judge(double a,double b,double c,double d)
{
	double total = a+b+c+d;
	double maxn = max(a,b);
	maxn = max(maxn,c);
	maxn = max(maxn,d);
	if(total > 2*maxn) //判断能否构成四边形 
		return true;
	return false;
}
int main()
{
	int n;
	double a,b,c,d,sum,s;
	scanf("%d",&n);
	for(int i = 1; i <= n; i++)
	{
		cin>>a>>b>>c>>d;
		if(judge(a,b,c,d))
		{
			s = (a+b+c+d)/2.0;
			sum = sqrt((s-a)*(s-b)*(s-c)*(s-d));
			printf("Case %d: %.6lf\n",i,sum);
		}
		else
			printf("Case %d: -1\n",i);
	}
	return 0;
}

一般四边形面积公式:    (百度 婆罗摩笈多公式

推导:

 

(1)可以得到:S=

   
absinA+cdsinC

(2)由余弦定理可得:BD^2 = a^2+b^2-2abcosA = c^2+d^2-2cdcosC;

                         即: a^2+b^2-c^2-d^2 = 2abcosA-2cdcosC

(1)和(2)平方后相加(需要稍微的处理一丢丢)得:

        4S^2+(a^2+b^2-c^2-d^2 )^2 /4 = (absinA+cdsinC)^2+(abcosA-cdcosC)^2;

        4S^2+(a^2+b^2-c^2-d^2 )^2 /4 = (ab)^2+(cd)^2-2abcd(cos(A+C));

    当A+C = 180°时即cos(A+C) = -1  面积S最小(看出来了吧)

    则:

        S^2 = ( (ab)^2+(cd)^2 +2*abcd )/4 - (a^2+b^2-c^2-d^2 )^2 /16;

        S^2 = ( (2ab+2cd)^2- (a^2+b^2-c^2-d^2 )^2  ) / 16;

        平方差公式后:

        S^2 = (  (a+b)^2 - (c+d)^2)((c+d)^2 -  (a+b)^2  )/16

        平方差公式后:

        S^2 =(a+b+c-d)(a+b+d-c)(a+c+d-b)(b+c+d-a);

        S =     (此时A,B,C,D位于其外接圆上)

其中 s为半周长:
 


猜你喜欢

转载自blog.csdn.net/nothing_227/article/details/81030168