方法改进,精度可调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分
2 人评分
C语言程序设计教程(第三版)课后习题10.3 (C语言代码)浏览:821 |
C二级辅导-等差数列 (C语言代码)浏览:760 |
点我有惊喜!你懂得!浏览:2700 |
C语言考试练习题_一元二次方程 (C语言代码)浏览:732 |
C语言程序设计教程(第三版)课后习题6.3 (C语言代码)浏览:424 |
【明明的随机数】 (C++代码)浏览:779 |
C语言程序设计教程(第三版)课后习题1.5 (C语言代码)浏览:547 |
2003年秋浙江省计算机等级考试二级C 编程题(2) (C语言代码)浏览:744 |
【偶数求和】 (C语言代码)浏览:556 |
C语言程序设计教程(第三版)课后习题8.7 (C语言代码)浏览:593 |