题意:
给定n个圆的 坐标 和半径, 求第一个圆与其他圆相交的面积占第一个圆的面积的多大。
分析:
如果从局部去想, 处理每个圆之间的关系, 求出他们与第一个圆的交集, 这样可能就会十分复杂了。
不妨从总体去想, 因为答案要求的数字并不是十分精确(保留两位小数), 那么我们可以试试随机算法,
想象在第一个圆内撒绿豆, 那么绿豆肯定会落到第一个圆与其他圆相交的区域, 这时候统计一下撒的绿豆和在区域中的绿豆就可以大概算出这个数字了。
这里有个技巧是用
rand() /(double)(RAND_MAX/'num') 生成 0 ~ num 的浮点数 rand()/(double)RAND_MAX 就是生成一个0 ~ 1的浮点数
1 #include <bits/stdc++.h> 2 using namespace std; 3 const int maxn = 25 + 7; 4 int n; 5 6 double x[maxn], y[maxn], r[maxn]; 7 8 double p2pdis(double x1, double y1, double x2, double y2){ 9 return sqrt((x1-x2) * (x1 - x2) + (y1 - y2) * (y1 - y2)); 10 } 11 12 int main(){ 13 while(scanf("%d", &n) && n){ 14 for(int i = 0; i < n; i++){ 15 scanf("%lf %lf %lf", &x[i], &y[i], &r[i]); 16 } 17 int time = 2e5;//设置最多循环次数, 在不超时的情况下设置的越大越好 18 int in = 0, tot = 0; 19 while(time--){ 20 double tx,ty; 21 tx = x[0] + rand() /(double)(RAND_MAX/ (-2 * r[0])) + r[0]; // 令tx在x的半径内随机 22 ty = y[0] + rand() /(double)(RAND_MAX/(-2 * r[0])) + r[0]; // 令ty在y的半径内随机 23 if(p2pdis(tx,ty,x[0],y[0]) <= r[0]){//此时还要判断一下这个点,是否在圆内, 因为我们是在以圆点为中心的正方形内取点 24 tot++;//判断多少个点符合 25 for(int i = 1; i < n; i++){ 26 if(p2pdis(tx,ty,x[i],y[i]) <= r[i]){ 27 in++;//判断多少个点在小圆内 28 break; 29 } 30 } 31 } 32 } 33 printf("%.2f ",(double)in/tot); 34 } 35 }