方法改进,精度可调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语言训练-阶乘和数* (C语言代码)浏览:981 |
母牛的故事 (C语言代码)浏览:435 |
c primer plus 第十二章 12.1小节浏览:377 |
剪刀石头布 (C语言代码)不知道怎么直接在scanf中用枚举变量浏览:1307 |
C语言程序设计教程(第三版)课后习题5.4 (C语言代码)浏览:885 |
计算质因子 (C++代码)浏览:1619 |
2003年秋浙江省计算机等级考试二级C 编程题(2) (C语言代码)浏览:654 |
A+B for Input-Output Practice (IV) (C语言代码)浏览:451 |
蚂蚁感冒 (C语言代码)浏览:768 |
1051(奇了怪了)浏览:646 |