方法改进,精度可调2进制关系,由粗到细映射查找没覆盖的点,精度调整测试只有两个结果,时间超时和答案错误,说明不能用划分为小点来加起来近似面积,估计要用函数方法
#include<stdio.h>
#include<math.h>
void jisuan(double s1,double sm,double zhi);
double x[50],y[50],z[50],r[50],g,G,sum=0,kl,km,ZHI=2;//可调
int a,b,n,i;
char flag1=0,flag2=0;
int main()
{
scanf("%d %d %lf %d",&a,&b,&g,&n);
G=cos(g*atan(1)/45)/sin(g*atan(1)/45);
for(i=0;i<n;i++)
{
scanf("%lf %lf %lf %lf",&x[i],&y[i],&z[i],&r[i]);
x[i]=x[i]-z[i]*G;
}
while(a<8*ZHI||b<8*ZHI)//可调
ZHI=ZHI/2;
for(kl=ZHI;kl<a;kl=kl+2*ZHI)
{
for(km=ZHI;km<b;km=km+2*ZHI)
{
flag1=0,flag2=0;
for(i=0;i<n;i++)
{
if((r[i]-sqrt(2)*ZHI)>0)
if(pow((kl-x[i]),2)+pow((km-y[i]),2)<pow(r[i]-sqrt(2)*ZHI,2))
flag1=1;
if(pow((kl-x[i]),2)+pow((km-y[i]),2)<pow(r[i]+sqrt(2)*ZHI,2))
flag2=1;
}
if(flag2==0)
sum=sum+4*ZHI*ZHI;
else if(flag1==0)
{
jisuan(kl,km,ZHI/2);
}
}
}
printf("%.2lf\n",sum);
/* getchar();
getchar();*/
}
void jisuan(double sl,double sm,double zhi)
{
double l=0,m=0;
if(zhi>pow(2,-7))//可调
{
for(l=sl-zhi;l<sl+zhi*2;l=l+zhi*2)
{
for(m=sm-zhi;m<sm+zhi*2;m=m+zhi*2)
{
flag1=0,flag2=0;
for(i=0;i<n;i++)
{
if((r[i]-sqrt(2)*zhi)>0)
if(pow((l-x[i]),2)+pow((m-y[i]),2)<pow(r[i]-sqrt(2)*zhi*2,2))
flag1=1;
if(pow((l-x[i]),2)+pow((m-y[i]),2)<pow(r[i]+sqrt(2)*zhi*2,2))
flag2=1;
}
if(flag2==0)
sum=sum+4*zhi*zhi;
else if(flag1==0)
{
jisuan(l,m,zhi/2);
}
}
}
}
else
{
for(l=sl-zhi;l<sl+zhi*2;l=l+zhi*2)
{
for(m=sm-zhi;m<sm+zhi*2;m=m+zhi*2)
{
flag1=0,flag2=0;
for(i=0;i<n;i++)
{
if(pow((l-x[i]),2)+pow((m-y[i]),2)<pow(r[i],2))
flag2=1;
}
if(flag2==0)
sum=sum+4*zhi*zhi;
}
}
}
}
0.0分
1 人评分
C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:
一点编程也不会写的:零基础C语言学练课程
解决困扰你多年的C语言疑难杂症特性的C语言进阶课程
从零到写出一个爬虫的Python编程课程
只会语法写不出代码?手把手带你写100个编程真题的编程百练课程
信息学奥赛或C++选手的 必学C++课程
蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程
发表评论 取消回复