方法改进,精度可调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.0分

1 人评分

C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:

一点编程也不会写的:零基础C语言学练课程

解决困扰你多年的C语言疑难杂症特性的C语言进阶课程

从零到写出一个爬虫的Python编程课程

只会语法写不出代码?手把手带你写100个编程真题的编程百练课程

信息学奥赛或C++选手的 必学C++课程

蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程

手把手讲解近五年真题的蓝桥杯辅导课程

评论列表 共有 0 条评论

暂无评论