1. 在直角坐标系中,有N个半径都是1的圆,不存在两个完全重合的圆,并且圆心的坐标都是整数,统计这些圆所覆盖的总面积S。
输入:数据一共N+1行,第一行为一个正整数N(0<N<=100),表示圆的的个数,以下N行每行有两个整数,由空格分开,代表圆心坐标。
输出:统计出的总面积S,四舍五入到小数点后4位。(π=3.1415926)
输入输出样例:
输入: N=2
0 0
1 0
输出: S=5.0548
----------------解决方案--------------------------------------------------------
1.(int *)malloc(N*sizeof(int )) and free();
2.可以考虑用循环把全部圆面积总和求出来,再减去重叠那部分,这应该要用到数学公式了;
3.printf("%5.4f",S);
----------------解决方案--------------------------------------------------------
能再详细点吗?
----------------解决方案--------------------------------------------------------
想不到办法,
按2楼所说,还得用到容斥原理,还有圆与圆之间的相交部分如果要算的话,恐怕还得用积分来算,而且当两两相交的圆的个数比较大时,这个积分的难度要大大提高……
我高等数学学得差,有高手给出完整的程序吗?
----------------解决方案--------------------------------------------------------
数学方面的我不做研究
----------------解决方案--------------------------------------------------------
好难啊,!
----------------解决方案--------------------------------------------------------
----------------解决方案--------------------------------------------------------
难啊
----------------解决方案--------------------------------------------------------
----------------解决方案--------------------------------------------------------
俺想了老半天,想出一个垃圾算法,说出来,大家参考参考,别取笑:
我的算法是用概率去算:
1,从输入的N个点中找出最靠左边的横坐标和最右边的横坐标,最上面的纵坐标和最下面的纵坐标;
2,分别把它们分别减1作成一个正方形临界框;
3,随机生成1000个点坐标(把它们都限制在正方形中),判断是否在圆的集合中,如果在, counter++(初始为0);
4,用counter/1000*正方形的面积,近似得到圆的面积;
然而,这个算法只能达到近似,为求准确,得让随机生成的点更多,而这将使程序循环过多,计算速度也将变慢.
----------------解决方案--------------------------------------------------------