题意:http://www.lightoj.com/volume_showproblem.php?problem=1118
利用数学公式解决
#include<cstdio> #include<cstring> #include<algorithm> #include<iostream> #include<queue> #include<map> #include<vector> #include<math.h> #include<string> using namespace std; #define INF 0x3f3f3f3f #define LL long long #define N 1009 #define Lson rood<<1 #define Rson rood<<1|1 #define PI acos(-1) double q(double x1,double y1,double r1,double x2,double y2,double r2) { double d=1.0*sqrt((x1-x2)*(x1-x2)+1.0*(y1-y2)*(y1-y2)); if(d<1e-6||d+min(r1,r2)<=max(r1,r2))///内含 return min(PI*r1*r1,PI*r2*r2); if(d>r1+r2) return 0; double a=acos((d*d+r1*r1-r2*r2)/(2*d*r1));///利用余弦公式 double a1=a*r1*r1;///a*a=b*b+c*c-2*b*c*cos(A); a=acos((d*d+r2*r2-r1*r1)/(2*d*r2)); double a2=a*r2*r2;///扇形的面积 double s=(d+r1+r2)/2;///海伦定理 double san=sqrt(s*(s-d)*(s-r1)*(s-r2))*2;///因为有两个三角形 乘2 return a1+a2-san; } int main() { int T,t=1; scanf("%d",&T); while(T--) { double x1,x2,y1,y2,r1,r2; scanf("%lf%lf%lf%lf%lf%lf",&x1,&y1,&r1,&x2,&y2,&r2); printf("Case %d: %.6f\n",t++,q(x1,y1,r1,x2,y2,r2)); } return 0; }