方法改进,精度可调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语言程序设计教程(第三版)课后习题11.1 (C语言代码)浏览:675 |
C语言程序设计教程(第三版)课后习题7.2 (C语言代码)浏览:681 |
简单的a+b (C语言代码)浏览:643 |
C语言程序设计教程(第三版)课后习题8.2 (Java代码)浏览:2268 |
C语言程序设计教程(第三版)课后习题4.9 (C语言代码)浏览:377 |
C语言程序设计教程(第三版)课后习题1.5 (C语言代码)浏览:468 |
1124题解浏览:591 |
C语言训练-亲密数 (C语言描述,反正怎么都能对)浏览:2155 |
C语言程序设计教程(第三版)课后习题10.3 (C语言代码)浏览:508 |
妹子杀手的故事 (C语言代码)浏览:1045 |