饮清


私信TA

用户名:uq_34130743599

访问量:3115

签 名:

代码要求简短,自己做一个看别人十个,找最简的

等  级
排  名 12301
经  验 910
参赛次数 0
文章发表 7
年  龄 0
在职情况 学生
学  校
专  业

  自我简介:

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

  评论区